Wyłącz WLan, jeśli dostępna jest sieć przewodowa / kablowa

39

Pytanie mówi wszystko. Chcę tylko, aby moje połączenie W-Lan było wyłączone, gdy tylko będzie dostępne połączenie przewodowe. Jaki byłby najłatwiejszy sposób na to w Ubuntu / Gnome?

We wszystkich przewodnikach (na przykład o guessnet) stwierdziłem, że musiałem skonfigurować całą konfigurację sieci (klucze WPA, DHCP, ...), ale uważam, że jest to trochę zbyt skomplikowane jak na tak prosty przypadek użycia. Chcę tylko wyłączyć, wlan0gdy eth0jest podłączony.

Ingo Fischer
źródło
Odpowiedź na to pytanie różni się w zależności od komputera. Nie wiem, czy Ubuntu na to pozwala, ale zazwyczaj znalazłem opcję w systemie BIOS.
Iszi 14.01.11
Nie mam na myśli completely disablewlan, mam na myśli wyłączenie Ubuntu, aby spróbować połączyć się z dowolnym wlanem, jeśli połączenie przewodowe jest dostępne. Więc to jest kwestia systemu operacyjnego.
Ingo Fischer

Odpowiedzi:

55

Możesz upuścić ten skrypt do /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

Nie zapomnij później:

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

Przechwytuje to starsze eth*nazwy i nowe jądro „przewidywalne nazwane interfejsy”, które zaczynają się od, ena następnie używają ścieżki magistrali lub adresu MAC, aby nazwa każdego interfejsu była taka sama przy każdym uruchomieniu. To działało z USB-C (przejście) i przejściówką Ethernet Ethernet, z którą próbowałem i jestem pewien, że będzie działać również z wbudowanymi adapterami.

derhoch
źródło
Moja sieć bezprzewodowa próbowała połączyć się raz za razem i zaczynała być naprawdę irytująca. Dzięki za ten skrypt, w końcu przestał pytać mnie o hasło sieciowe. Czy skrypt zostanie uruchomiony automatycznie po ponownym uruchomieniu komputera?
Joel Lord,
2
@joellord: Ten skrypt jest uruchamiany automatycznie przy każdym uruchomieniu lub zatrzymaniu interfejsu sieciowego. Po rozłączeniu eth0 połączenie bezprzewodowe zostanie włączone. Po podłączeniu eth0 twoja sieć bezprzewodowa zostanie wyłączona.
phord
1
Solid - działa idealnie i niezły minimalny skrypt.
Air
3
W wersji 1.0.2 nmcli musiałem zmienić „nmcli nm wifi”, nmcli r wifi gdzie roznacza radio
Alessandro Pezzato
1
Ubuntu 16.04, wersja bash 4.3.48, aby ten skrypt działał, należy usunąć cytaty.
Carles Sala
8

Od wersji 0.9.10 menedżera sieci pierwszy skrypt musi zostać zmodyfikowany

#!/bin/bash

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

Mam nadzieję, że to pomoże!

mruellan
źródło
Prawdopodobnie może to być samodzielna odpowiedź. Ogromnie pomogłoby powiedzieć, z jaką wersją menedżera sieci ta zmiana się dzieje.
Journeyman Geek
wydaje się być Od wersji 0.9.10. wiki.gnome.org/Projects/NetworkManager/nmcli
mruellan
To rozwiązanie jest niewłaściwe, ponieważ działa tylko wtedy, gdy interfejs LAN nazywa się „eth0”.
Carles Sala
4

Po prostu dla gnomiego interfejsu GUI ...

  1. Kliknij prawym przyciskiem myszy wskaźnik systemu sieciowego w panelu gnome, zgodnie z zegarem. (Wskaźnik będzie jedną z dwóch ikon; strzałkami w górę / w dół (LAN) lub tradycyjnym lejkiem Wi-Fi. Pamiętaj, że ikona w górę / w dół pojawi się, gdy podłączone są obie sieci LAN i WiFi lub tylko sieć LAN, a lejek Wi-Fi pojawia się, gdy podłączony TYLKO przez WiFi. (LAN Disconnected)) - [LAN automatycznie przebija WiFi. *]

  2. Wybierz „Edytuj połączenia ...”

  3. Wybierz zakładkę „Wireless”.
  4. Kliknij dwukrotnie pierwsze połączenie na liście i odznacz pole „Połącz automatycznie”.
  5. Kliknij przycisk „Zastosuj ...”.
  6. Powtórz dla każdego połączenia na liście.

Dzięki temu sieć bezprzewodowa będzie działać w trybie ręcznych połączeń i rozłączeń w locie, klikając lewym przyciskiem myszy ikonę sieci, bez konieczności ciągłego automatycznego łączenia się przez NM.

Naturalnie możesz również wyłączyć / włączyć sieć bezprzewodową, klikając prawym przyciskiem myszy ikonę sieci, a następnie klikając lewym przyciskiem myszy opcję „Włącz sieć bezprzewodową”, skutecznie obniżając lub podnosząc interfejs sieci bezprzewodowej, na co wskazuje obecność lub brak zaznaczenia.

  • LAN automatycznie przebija WiFi, nie ma potrzeby wyłączania WiFi. Wystarczy odłączyć kabel Ethernet, aby bezproblemowo przenieść połączenie na Wi-Fi i możesz bez problemu przejmować i przemieszczać się. Podobnie z ponownym podłączeniem sieci LAN.
  • Podczas gdy sieć LAN przebija WiFi, NM (Network Manager) znajdzie to, czego szukasz, będąc jednocześnie w różnych sieciach i pracuje zarówno w trybie online (WiFi), jak i na przykład z lokalnym hostem (LAN) lub V / V.
rjbradlow
źródło
2

Tylko zgadnij, ale zakładam, że ifplugd może pomóc. Możesz wyłączyć Wi-Fi, gdy używany jest kabel.

ggustafsson
źródło
Dzięki, już o tym czytałem. W ifplugd nie podoba mi się to, że muszę wprowadzić wszystkie moje ustawienia sieciowe /etc/network/interfaces. Nie jestem zbyt dobry w pracy w sieci, więc zastanawiam się, gdzie mogę uzyskać wszystkie potrzebne wartości z moich istniejących połączeń? Nadal mam nadzieję, że istnieje prostsze rozwiązanie.
Ingo Fischer,
1

Utwórz dwa proste „skrypty”, nazwa skryptu nie jest ważna (po prostu używam wlan) i zakładam, że istnieje tylko jeden interfejs sieciowy z kablami, i dlatego nazywa się „eth0” ... Sprawdź to za pomocą „ifconfig”, jeśli nie jestem pewien. Pamiętaj, że to całkowicie wyłączało sieć bezprzewodową, nie tylko wlan0. (Problem występuje tylko wtedy, gdy masz wiele interfejsów WLAN i chcesz tylko wyłączyć określone)

Skrypty te można łatwo dostosować - logiką logiczną - do sytuacji, w której masz dwa lub więcej okablowanych interfejsów sieciowych.

Upewnij się, że te skrypty można wykonać za pomocą „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

Włącza / wyłącza połączenia bezprzewodowe w NetworkManager, który zwykle można znaleźć jako wskaźnik systemu w panelu Gnome.

Możesz także użyć „ifconfig wlan0 down” lub „ifconfig wlan0 up” zamiast linii dbus-send, ale powinno to być bardziej przyjazne dla użytkownika i mniej zakłócać narzędzia systemowe Ubuntu.

Testowany z Ubuntu Desktop 10.10 i powinien działać z wcześniejszymi wersjami lub innymi dystrybucjami przy użyciu NetworkManager i dbus.

joentjuh
źródło
Jest to prawdopodobnie funkcjonalnie równoważne z zaakceptowanymi nmcli radio wifi offodpowiedziami, ale byłbym ciekawy, co zgłaszają dzienniki systemowe podczas zamykania połączeń w obie strony, aby sprawdzić, czy ktoś jest bardziej „wdzięczny”.
dragon788
1

Działa to dla mnie w Debianie niestabilnym, jądro> 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
Zapytaj o wszystko
źródło
1

Jest to poprawka do poprzedniej odpowiedzi Cyryla Fessla. (Nie mam reputacji by skomentować.) Ten działa dla Fedory, jak również, w których interfejsy sieciowe mogą teraz mieć takie nazwy jak wlan0, wlp6s0, em1i enp0s20u2u1). Ta odmiana nie próbuje dopasować nazwy interfejsu, ale szuka /sys/class/netinformacji na urządzeniu. Działa na moim laptopie Fedora 21 (jądro 3.18) i wierzę, że zadziała również na Debianie> = 7.

#! / bin / sh

[$ -ge 2] || wyjście 1

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

IFACE = 1 USD
AKCJA = 2 USD

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

jeśli $ DEBUG; następnie
    if [-e "/ sys / class / net / $ IFACE / device"]; następnie
        log "/ sys / class / net / $ IFACE / device istnieje"
    jeszcze
        log "/ sys / class / net / $ IFACE / device nie istnieje"
    fi

    if [-e "/ sys / class / net / $ IFACE / wireless"]; następnie
        log "/ sys / class / net / $ IFACE / wireless istnieje"
    jeszcze
        log "/ sys / class / net / $ IFACE / wireless nie istnieje"
    fi
fi

sprawa $ {AKCJA} w
    w górę)
        rm -rf $ STATEDIR / $ IFACE

        # Nic nie rób, jeśli nie jest to urządzenie fizyczne.
        Jeśli [ ! -e "/ sys / class / net / $ IFACE / device"]; następnie
            zaloguj „$ IFACE nie jest urządzeniem fizycznym - ignorowanie”
            wyjście 0
        fi

        # Nic nie rób, jeśli jest to urządzenie bezprzewodowe.
        if [-d "/ sys / class / net / $ IFACE / wireless"]; następnie
            zaloguj „$ IFACE nie jest urządzeniem przewodowym - ignorowanie”
            wyjście 0
        fi

        # Śledź urządzenia przewodowe. Kiedy zejdą na dół,
        # węzeł urządzenia może również przejść (np. klucz USB Ethernet Ethernet),
        # więc nie moglibyśmy powiedzieć, jaki typ urządzenia.
        dotknij $ STATEDIR / $ IFACE

        # Teraz wyłącz Wi-Fi.
        zaloguj „zamykanie WiFi”
        nmcli r wifi wyłączone
        ;;
    na dół)
        # Sprawdź, czy wcześniej rozpoznaliśmy $ IFACE jako
        # fizyczne, przewodowe urządzenie.
        Jeśli [ ! -e $ STATEDIR / $ IFACE]; następnie
            zaloguj „$ IFACE nie jest urządzeniem przewodowym - ignorowanie”
            wyjście 0
        fi

        rm -rf $ STATEDIR / $ IFACE

        # Zamiast sprawdzania pojedynczego pliku, możemy również sprawdzić
        # czy nadal są pliki w $ STATEDIR. Jeśli tak, to my
        # nadal ma włączone urządzenie przewodowe ...
        zaloguj „włączanie WiFi”
        nmcli r wifi włączone
        ;;
esac
Steven
źródło
1

Jeśli już używasz TPLP do zarządzania energią, ma to funkcję.

Musisz zmodyfikować plik conf (/ 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
źródło
Czy „zadokowany” oznacza podłączony do zasilania lub podłączony do dosłownej stacji dokującej / replikatora portów lub po prostu podłączony do czegoś, co zapewnia połączenie LAN?
dragon788,
0

Z jakiegokolwiek powodu obecna najwyższa odpowiedź derhocha nie działa dla mnie, nawet jeśli powinna. Niektóre inne sugestie działają, ale chciałem czegoś bardzo prostego. Tak więc używam następującego skryptu (który wstawiam, /etc/NetworkManager/dispatcher.d/aby włączać i wyłączać Wi-Fi w zależności od eth0statusu.

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

To elsestwierdzenie jest prawdopodobnie niepotrzebne i może nawet stanowić problem w niektórych warunkach, ale zostawiłem je tam na wszelki wypadek (bez tego oświadczenia, jeśli eth0jest w dół, nigdy się nie pojawia).

Andy Forceno
źródło
Jak to systemowo to zrobić?
Xofo