Désactiver WLan si un réseau câblé / câble est disponible

39

La question dit tout. Tout ce que je veux, c'est que ma connexion W-Lan soit désactivée chaque fois qu'une connexion câblée est disponible. Quel serait le moyen le plus simple de faire cela dans Ubuntu / Gnome?

Dans tous les guides (par exemple certains sur guessnet), j’ai trouvé qu’il me fallait configurer toute la configuration de mon réseau (clés WPA, DHCP, ...), mais j’ai trouvé cela un peu trop compliqué pour un cas d’utilisation aussi simple. Je veux juste désactiver wlan0quand eth0est connecté.

Ingo Fischer
la source
La réponse à cette question varie d'un ordinateur à l'autre. Je ne sais pas si Ubuntu le permet, mais généralement, j’ai trouvé que c’était une option dans le BIOS.
Iszi
Je ne veux pas dire completely disablewlan, je veux dire désactiver Ubuntu pour essayer de se connecter à n’importe quel wlans si une connexion filaire est disponible. Donc, c'est une chose OS.
Ingo Fischer

Réponses:

56

Vous pouvez déposer ce script pour /etc/NetworkManager/dispatcher.d/99-wlan:

#!/bin/bash
wired_interfaces="en.*|eth.*"
if [[ "$1" =~ $wired_interfaces ]]; then
    case "$2" in
        up)
            nmcli radio wifi off
            ;;
        down)
            nmcli radio wifi on
            ;;
    esac
fi

N'oubliez pas après:

chmod +x /etc/NetworkManager/dispatcher.d/99-wlan

Cela intercepte les eth*noms hérités et le nouveau noyau "interfaces nommées prévisibles" qui commencent par en, puis utilisent le chemin de bus ou l'adresse MAC, de sorte que le nom de chaque interface est identique à chaque démarrage. Cela a fonctionné avec les adaptateurs USB-C (passthrough) et USB Ethernet que j'ai essayés et je suis convaincu que cela fonctionnera également avec les adaptateurs intégrés.

derhoch
la source
Mon réseau sans fil essayait de me connecter encore et encore et cela commençait à être vraiment irritant. Merci pour ce script, il a finalement cessé de me demander un mot de passe réseau. Le script sera-t-il automatiquement lancé lorsque je redémarre mon ordinateur?
Joel Lord
2
@joellord: ce script est automatiquement exécuté à chaque démarrage ou arrêt d'une interface réseau. Lorsque vous déconnectez eth0, votre réseau sans fil est activé. Lorsque vous vous connectez à eth0, votre réseau sans fil est désactivé.
phord
1
Solide - fonctionne parfaitement et beau script minimal.
Air
3
Avec la version 1.0.2 de nmcli, je devais changer `nmcli nm wifi` avec nmcli r wifi where rsignifie radio
Alessandro Pezzato
1
Ubuntu 16.04, bash version 4.3.48, les guillemets doivent être supprimés pour que ce script fonctionne.
Carles Sala
8

Depuis la v0.9.10 du gestionnaire de réseau, le premier script doit être modifié

#!/bin/bash

if [ "$1" = "eth0" ]; then
    case "$2" in
        up)
            nmcli radio wifi off
            ;;
        down)
            nmcli radio wifi on
           ;;
   esac
fi

J'espère que ça aide!

mruellan
la source
Cela peut probablement être une réponse autonome. Cela aiderait énormément de dire avec quelle version de gestionnaire de réseau ce changement se produit.
Journeyman Geek
semble être Depuis la v0.9.10. wiki.gnome.org/Projects/NetworkManager/nmcli
mruellan
1
Cette solution n’est pas correcte car elle ne fonctionne que si votre interface LAN est appelée "eth0".
Carles Sala
4

Tout simplement pour l’interface graphique gnome ...

  1. Cliquez avec le bouton droit de la souris sur l'indicateur de système réseau dans le panneau de gnome, à côté de votre horloge. (L’indicateur sera l’une des deux icônes: les flèches haut / bas (LAN) ou l’entonnoir WiFi traditionnel. Notez que l’icône haut / bas apparaîtra lorsque LAN & WiFi ou uniquement le LAN est connecté et que l’entonnoir WiFi apparaît quand connecté via WiFi UNIQUEMENT. (LAN déconnecté)) - [Le ​​LAN passe automatiquement au WiFi. *]

  2. Sélectionnez 'Edit Connections ...'

  3. Sélectionnez l'onglet "Sans fil".
  4. Double-cliquez sur la première connexion de votre liste et décochez la case "Se connecter automatiquement".
  5. Cliquez sur le bouton "Appliquer ...".
  6. Répétez cette procédure pour chaque connexion de la liste.

Cela laissera le réseau sans fil opérationnel pour les connexions et déconnexions manuelles à la volée disponibles en cliquant sur l'icône du réseau, sans que le NM ne tente de vous connecter automatiquement à tout moment.

Naturellement, vous pouvez également activer / désactiver le réseau sans fil en cliquant avec le bouton droit de la souris sur l’icône du réseau, puis en sélectionnant «Activer le réseau sans fil», ce qui permet d’activer ou de désactiver l’interface sans fil comme indiqué par la présence ou non de la case à cocher.

  • Le réseau local l'emporte automatiquement sur le WiFi, il n'est pas nécessaire de le désactiver. En débranchant simplement votre câble Ethernet, la connexion au WiFi est transférée de manière transparente. Vous pouvez ainsi vous connecter et vous déplacer sans problème. De même, en reconnectant le réseau local.
  • Alors que le réseau local dépasse le WiFi, le NM (gestionnaire de réseau) trouvera ce que vous cherchez si vous êtes sur plusieurs réseaux simultanément et travaillez à la fois en ligne (WiFi) et avec un hôte local (LAN) ou V / V, par exemple.
rjbradlow
la source
2

Juste une supposition, mais je suppose que ifplugd pourrait aider. Vous pouvez le faire arrêter wifi lorsque le câble est utilisé.

Ggustafsson
la source
Merci, j'ai déjà lu à ce sujet. Ce que je n'aime pas chez ifplugd, c'est que je dois mettre tous mes paramètres réseau dans /etc/network/interfaces. Je ne suis pas très bon en réseau, alors je me demande où je pourrais obtenir toutes les valeurs nécessaires de mes connexions existantes? J'espère toujours qu'il existe une solution plus simple.
Ingo Fischer
1

Créez deux 'scripts' simples, le nom du script n’a pas d’importance (j’utilise simplement wlan) et je suppose qu’il n’ya qu’une seule interface réseau câblée, et s’appelle donc 'eth0' ... Cochez cette case avec 'ifconfig' si vous n'êtes pas sûr. Notez que cette désactivation sans fil entièrement, pas seulement wlan0. (Un problème uniquement si vous avez plusieurs interfaces wlan et que vous souhaitez uniquement désactiver certaines interfaces)

Ces scripts pourraient facilement être adaptés - par la logique booléenne - à une situation dans laquelle vous avez deux ou plusieurs interfaces réseau câblées.

Assurez-vous que ces scripts sont exécutables avec 'chmod + x'

/etc/network/ip-up.d/wlan

#!/bin/sh
# If eth0 goes up, disable wireless
if [ "$IFACE" = "eth0" ]; then
  dbus-send --system --type=method_call --dest=org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.DBus.Properties.Set string:org.freedesktop.NetworkManager string:WirelessEnabled variant:boolean:false
fi

/etc/network/if-down.d/wlan

#!/bin/sh
# If eth0 goes down, enable wireless
if [ "$IFACE" = "eth0" ]; then
  dbus-send --system --type=method_call --dest=org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.DBus.Properties.Set string:org.freedesktop.NetworkManager string:WirelessEnabled variant:boolean:true
fi

Cela active / désactive le sans fil dans le NetworkManager qui peut généralement être trouvé comme indicateur système dans le panneau Gnome.

Vous pouvez également utiliser 'ifconfig wlan0 down' ou 'ifconfig wlan0 up' au lieu de la ligne dbus-send, mais cela devrait être plus convivial et interférer moins avec les utilitaires système d'Ubuntu.

Testé avec Ubuntu Desktop 10.10 et devrait fonctionner avec des versions antérieures ou d'autres distributions utilisant NetworkManager et dbus.

Joentjuh
la source
Ceci est probablement équivalent du point de vue fonctionnel aux nmcli radio wifi offréponses acceptées, mais je serais curieux de voir ce que les journaux système rapportent lors de la fermeture des connexions dans les deux sens pour voir si l’une est plus "élégante".
dragon788
1

Cela fonctionne pour moi dans Debian unstable, kernel> 3.17

#!/bin/sh
myname=$(basename "$0") || exit 1
log() { logger -p user.info -t "${myname}[$$]" "$*"; }
IFACE=$1
ACTION=$2

case ${IFACE} in
    eth*|usb*)
        case ${ACTION} in
            up)
                nmcli r wifi off
                ;;
            down)
                nmcli r wifi on
                ;;
        esac
        ;;
esac
Demande-moi n'importe quoi
la source
1

C'est une amélioration par rapport à la réponse précédente de Cyril Fessl. (Je n'ai pas la réputation de commentaire.) Celui - ci fonctionne pour Fedora et où les interfaces réseau peuvent maintenant avoir des noms comme wlan0, wlp6s0, em1et enp0s20u2u1). Cette variante n'essaie pas de faire correspondre le nom de l'interface, mais cherche plutôt dans/sys/class/net des informations sur le périphérique. Fonctionne sur mon ordinateur portable Fedora 21 (noyau 3.18), et je pense que cela fonctionnera également sur Debian> = 7.

#! / bin / sh

[$ # -ge 2] || sortie 1

DEBUG = false
STATEDIR = / var / run / nm-wired
mkdir -p $ STATEDIR

IFACE = 1 $
ACTION = 2 $

myname = $ (nom de base "$ 0") || sortie 1
log () {logger -p user.info -t "$ {monNom}} [$$]" "$ IFACE / $ ACTION: $ *"; }

si $ DEBUG; puis
    if [-e "/ sys / class / net / $ IFACE / device"]; puis
        log "/ sys / class / net / $ IFACE / device existe"
    autre
        log "/ sys / class / net / $ IFACE / device n'existe pas"
    Fi

    si [-e "/ sys / class / net / $ IFACE / wireless"]; puis
        log "/ sys / class / net / $ IFACE / wireless existe"
    autre
        log "/ sys / class / net / $ IFACE / wireless n'existe pas"
    Fi
Fi

case $ {ACTION} dans
    up)
        rm -rf $ STATEDIR / $ IFACE

        # Ne faites rien s'il ne s'agit pas d'un périphérique physique.
        si [ ! -e "/ sys / class / net / $ IFACE / device"]; puis
            log "$ IFACE pas un périphérique physique - ignorer"
            sortie 0
        Fi

        # Ne faites rien s'il s'agit d'un périphérique sans fil.
        if [-d "/ sys / class / net / $ IFACE / wireless"]; puis
            log "$ IFACE n'est pas un périphérique câblé - à ignorer"
            sortie 0
        Fi

        # Gardez une trace des appareils câblés. Quand ils descendent, le
        Le nœud de périphérique peut également aller (par exemple, un dongle Ethernet USB),
        # nous n'aurions donc aucun moyen de dire quel type d'appareil était.
        touchez $ STATEDIR / $ IFACE

        # Maintenant, fermez le WiFi.
        log "arrêt du WiFi"
        nmcli r wifi off
        ;;
    vers le bas)
        # Vérifiez si nous avons déjà reconnu $ IFACE en tant que
        # physique, périphérique câblé.
        si [ ! -e $ STATEDIR / $ IFACE]; puis
            log "$ IFACE n'est pas un périphérique câblé - à ignorer"
            sortie 0
        Fi

        rm -rf $ STATEDIR / $ IFACE

        # Au lieu de vérifier un seul fichier, nous pourrions aussi vérifier
        # s'il y a encore des fichiers dans $ STATEDIR. Si oui, nous
        # toujours un périphérique câblé activé ...
        log "permettant WiFi"
        nmcli r wifi on
        ;;
esac
Steven
la source
1

Si vous utilisez déjà tlp pour la gestion de l’alimentation, une fonction permet de le faire.

Vous devez modifier votre fichier de configuration (/ etc / default / tlp)

# Radio devices to enable/disable when docked.
#DEVICES_TO_ENABLE_ON_DOCK=""
DEVICES_TO_DISABLE_ON_DOCK="wifi wwan"

# Radio devices to enable/disable when undocked.
DEVICES_TO_ENABLE_ON_UNDOCK="wifi"
#DEVICES_TO_DISABLE_ON_UNDOCK=""
Luis Cellino
la source
Est-ce que "ancré" signifie connecté à une source d’alimentation ou à un réplicateur de port ou à un duplicateur de ports ou simplement branché à quelque chose qui fournit une connexion LAN?
dragon788
0

Pour quelque raison que ce soit, la réponse actuelle de derhoch ne me convient pas, même si cela devrait être le cas. Certaines des autres suggestions fonctionnent, mais je voulais quelque chose de très simple. Donc, j'utilise le script suivant (que je mets /etc/NetworkManager/dispatcher.d/pour activer et désactiver le wifi en fonction du eth0statut de.

#! /bin/bash
# Enable/disable wlan0 depending on eth0 and wlan0 current state

eth0_status=$(cat /sys/class/net/eth0/operstate)
wlan0_status=$(cat /sys/class/net/wlan0/operstate)

if [[ "$eth0_status" = "up" ]];
    then
        nmcli nm wifi off
elif [[ "$wlan0_status" = "down" ]] && [[ "$eth0_status" = "down" ]];
    then
        nmcli nm wifi on
else 
    nmcli nm eth0 on
    nmcli nm wlan0 off

fi

La elsedéclaration est probablement inutile, et pourrait même poser problème dans certaines conditions, mais je l'ai laissée là au cas où (sans cette déclaration, si elle eth0est en panne, elle ne sera jamais affichée).

Andy Forceno
la source
Quelle est la manière habituelle de faire cela?
Xofo