Deaktivieren Sie WLan, wenn ein Kabel- / Kabelnetzwerk verfügbar ist


38

Die Frage sagt alles. Ich möchte nur, dass meine W-Lan-Verbindung deaktiviert wird, sobald eine Kabelverbindung verfügbar ist. Was wäre der einfachste Weg, dies in Ubuntu / Gnome zu tun?

In allen Handbüchern (zum Beispiel über Guessnet) habe ich festgestellt, dass ich meine gesamte Netzwerkkonfiguration (WPA-Schlüssel, DHCP, ...) konfigurieren musste, aber ich finde das für einen einfachen Anwendungsfall etwas kompliziert. Ich möchte nur deaktivieren wlan0 wann eth0 Ist verbunden.


Die Antwort auf diese Frage ist von Computer zu Computer unterschiedlich. Ich weiß nicht, ob Ubuntu dies erlaubt, aber normalerweise habe ich festgestellt, dass dies eine Option im BIOS ist.
Iszi

Ich meine nicht completely disable das WLAN, ich meine Ubuntu deaktivieren, um zu versuchen, eine Verbindung zu allen WLANs herzustellen, wenn eine Kabelverbindung verfügbar ist. Es ist also eine OS-Sache.
ifischer

Antworten:


52

Sie können dieses Skript ablegen /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

Vergiss nicht danach:

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

Dies fängt das Erbe an eth* Namen und die neuen "vorhersagbaren benannten Schnittstellen" des Kernels, die mit beginnen en Verwenden Sie dann entweder den Buspfad oder die MAC-Adresse, damit der Name jeder Schnittstelle bei jedem Start gleich ist. Dies funktionierte mit dem USB-C (Passthrough) - und USB-Ethernet-Adapter, den ich ausprobiert habe, und ich bin zuversichtlich, dass es auch mit integrierten Adaptern funktioniert.


Mein WLAN versuchte immer wieder, sich zu verbinden, und es wurde wirklich nervig. Danke für dieses Skript, es hat mich endlich nach einem Netzwerkkennwort gefragt. Wird das Skript automatisch gestartet, wenn ich meinen Computer neu starte?
Joel Lord

2
@joellord: Dieses Skript wird automatisch jedes Mal ausgeführt, wenn eine Netzwerkschnittstelle gestartet oder gestoppt wird. Wenn Sie eth0 trennen, wird Ihr WLAN aktiviert. Wenn Sie eth0 verbinden, wird Ihr WLAN deaktiviert.
phord

1
Solide - funktioniert perfekt und schönes minimales Skript.
Air

3
Mit der nmcli-Version 1.0.2 musste ich `nmcli nm wifi` mit ändern nmcli r wifi woher r meint Radio
Alessandro Pezzato

1
Ubuntu 16.04, bash version 4.3.48, die Anführungszeichen müssen entfernt werden, damit dieses Skript funktioniert.
Carles Sala

8

Seit v0.9.10 des Netzwerkmanagers muss das erste Skript geändert werden

#!/bin/bash

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

Ich hoffe es hilft!


Dies kann wahrscheinlich eine eigenständige Antwort sein. Es wäre sehr hilfreich zu sagen Was Version des Netzwerkmanagers geschieht diese Änderung mit.
Journeyman Geek


Diese Lösung ist nicht richtig, da sie nur funktioniert, wenn Ihre LAN-Schnittstelle "Eth0" heißt.
Carles Sala

4

Ganz einfach für den gnome-GUI-Ansatz ...

  1. Klicken Sie im Gnome-Feld neben Ihrer Uhr mit der rechten Maustaste auf die Netzwerksystemanzeige. (Bei der Anzeige handelt es sich um eines von zwei Symbolen: entweder die Aufwärts- / Abwärtspfeile (LAN) oder den herkömmlichen WLAN-Trichter. Beachten Sie, dass das Auf / Ab-Symbol angezeigt wird, wenn sowohl LAN und WLAN als auch nur LAN verbunden sind und der WLAN-Trichter angezeigt wird Bei Verbindung über WLAN (LAN Disconnected)) - [LAN trumps WiFi automatisch. *]

  2. Wählen Sie "Verbindungen bearbeiten ...".

  3. Wählen Sie die Registerkarte "Wireless".
  4. Doppelklicken Sie auf die erste Verbindung in Ihrer Liste und deaktivieren Sie das Kontrollkästchen "Automatisch verbinden".
  5. Klicken Sie auf die Schaltfläche "Übernehmen ...".
  6. Wiederholen Sie dies für jede Verbindung in der Liste.

Dadurch ist das drahtlose Netzwerk für manuelle Verbindungen und Verbindungsabbrüche betriebsbereit, wenn Sie mit der linken Maustaste auf das Netzwerksymbol klicken, ohne dass der NM versucht, Sie automatisch immer automatisch zu verbinden.

Natürlich können Sie Wireless auch deaktivieren / aktivieren, indem Sie mit der rechten Maustaste auf das Netzwerksymbol klicken und dann mit der linken Maustaste auf die Option "Wireless aktivieren" klicken, wodurch die Wireless-Schnittstelle effektiv heruntergefahren oder angehoben wird.

  • LAN übertrumpft das WLAN automatisch, das WLAN muss nicht deaktiviert werden. Durch einfaches Trennen des Ethernet-Kabels wird die Verbindung nahtlos auf WLAN übertragen, und Sie können sich problemlos abheben und bewegen. Ebenso beim erneuten Verbinden des LAN.
  • Während LAN das WLAN übertrumpft, findet der Netzwerkmanager (Network Manager), was Sie suchen, wenn Sie gleichzeitig in verschiedenen Netzwerken sind und sowohl online (WLAN) als auch mit einem lokalen Host (LAN) oder V / V arbeiten.

2

Nur eine Vermutung, aber ich gehe davon aus, dass ifplugd helfen könnte. Sie können das WLAN herunterfahren, wenn das Kabel verwendet wird.


Danke, ich habe darüber schon gelesen. Was mir an ifplugd nicht gefällt, ist, dass ich alle meine Netzwerkeinstellungen vornehmen muss /etc/network/interfaces. Ich bin nicht sehr gut in Sachen Networking, also frage ich mich, wo ich alle benötigten Werte aus meinen bestehenden Verbindungen holen kann. Ich hoffe immer noch, dass es eine einfachere Lösung gibt.
ifischer

1

Erstellen Sie zwei einfache "Skripte", der Name des Skripts ist nicht wichtig (ich verwende einfach wlan) und ich gehe davon aus, dass es nur eine verkabelte Netzwerkschnittstelle gibt und daher "eth0" genannt wird. Überprüfen Sie dies mit "ifconfig", wenn Sie dies tun bist nicht sicher Beachten Sie, dass dieses WLAN nicht nur wlan0 deaktiviert ist. (Nur ein Problem, wenn Sie mehrere WLAN-Schnittstellen haben und nur bestimmte deaktivieren möchten.)

Diese Skripts können durch boolesche Logik leicht an eine Situation angepasst werden, in der Sie zwei oder mehr verkabelte Netzwerkschnittstellen haben.

Stellen Sie sicher, dass diese Skripts mit 'chmod + x' ausführbar sind.

/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

Dadurch wird Wireless im NetworkManager aktiviert / deaktiviert, der normalerweise als Systemanzeige im Gnome-Bedienfeld angezeigt wird.

Anstelle der dbus-send-Leitung können Sie auch 'ifconfig wlan0 down' oder 'ifconfig wlan0 up' verwenden. Dies sollte jedoch benutzerfreundlicher sein und die Ubuntu-Systemprogramme weniger beeinträchtigen.

Getestet mit Ubuntu Desktop 10.10 und sollte mit früheren Versionen oder anderen Distributionen mit NetworkManager und dbus funktionieren.


Dies ist wahrscheinlich funktional äquivalent zu den akzeptierten nmcli radio wifi off Antworten, aber ich wäre gespannt, was die Systemprotokolle beim Schließen der Verbindungen auf beide Arten melden, um zu sehen, ob eine "anmutigere" ist.
dragon788

1

Dies funktioniert für mich in Debian Unstable, Kernel & gt; 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

1

Dies ist eine Verbesserung der vorherigen Antwort von Cyril Fessl. (Ich habe nicht den Ruf, einen Kommentar abzugeben.) Dies funktioniert auch für Fedora, wo Netzwerkschnittstellen jetzt einen Namen haben können wlan0. wlp6s0. em1 und enp0s20u2u1 ). Diese Variante versucht nicht, mit dem Namen der Schnittstelle übereinzustimmen, sondern sieht eher hinein /sys/class/net Informationen zum Gerät. Funktioniert auf meinem Fedora 21-Laptop (Kernel 3.18), und ich glaube, es wird auch auf Debian & gt; = 7 funktionieren.

#!/bin/sh

[ $# -ge 2 ] || exit 1

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

IFACE=$1
ACTION=$2

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

if $DEBUG; then
    if [ -e "/sys/class/net/$IFACE/device" ]; then
        log "/sys/class/net/$IFACE/device exists"
    else
        log "/sys/class/net/$IFACE/device does not exist"
    fi

    if [ -e "/sys/class/net/$IFACE/wireless" ]; then
        log "/sys/class/net/$IFACE/wireless exists"
    else
        log "/sys/class/net/$IFACE/wireless does not exist"
    fi
fi

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

        # Don't do anything if this is not a physical device.
        if [ ! -e "/sys/class/net/$IFACE/device" ]; then
            log "$IFACE not a physical device -- ignoring"
            exit 0
        fi

        # Don't do anything if this is a wireless device.
        if [ -d "/sys/class/net/$IFACE/wireless" ]; then
            log "$IFACE not a wired device -- ignoring"
            exit 0
        fi

        # Keep track of wired devices. When they go down, the
        # device node may go as well (e.g. USB Ethernet dongle),
        # so we'd have no way of telling what type the device was.
        touch $STATEDIR/$IFACE

        # Now shut down WiFi.
        log "shutting down WiFi"
        nmcli r wifi off
        ;;
    down)
        # Check whether we previously recognised $IFACE as a
        # physical, wired device.
        if [ ! -e $STATEDIR/$IFACE ]; then
            log "$IFACE not a wired device -- ignoring"
            exit 0
        fi

        rm -rf $STATEDIR/$IFACE

        # Instead of checking a single file, we could also check
        # whether there are still files in $STATEDIR. If so, we
        # still have a wired device enabled...
        log "enabling WiFi"
        nmcli r wifi on
        ;;
esac

1

Wenn Sie bereits verwenden tlp Für die Energieverwaltung verfügt es über eine Funktion, um dies zu tun.

Sie müssen Ihre Conf-Datei ändern (/ 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=""

Bedeutet "angedockt", dass es an das Stromnetz angeschlossen ist oder an eine buchstäbliche Dockingstation / einen Port-Replikator oder einfach an etwas angeschlossen ist, das eine LAN-Verbindung bietet?
dragon788

0

Aus welchem ​​Grund auch immer, die aktuelle Spitze Antwort von derhoch funktioniert nicht für mich, obwohl es sollte. Einige der anderen Vorschläge funktionieren, aber ich wollte etwas sehr einfaches. Also verwende ich das folgende Skript (welches ich einlegte) /etc/NetworkManager/dispatcher.d/ WLAN ein- und ausschalten, abhängig von eth0 Status

#! /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

Das else Eine Aussage ist wahrscheinlich unnötig und kann unter bestimmten Umständen sogar ein Problem darstellen, aber ich habe sie dort nur für den Fall gelassen (ohne diese Aussage, wenn eth0 ist unten, es kommt nie hoch).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.