Disabilitare WLan se è disponibile la rete cablata / via cavo


39

La domanda dice tutto. Tutto quello che voglio è che la mia connessione W-Lan dovrebbe essere disabilitata ogni volta che è disponibile una connessione cablata. Quale sarebbe il modo più semplice per farlo in Ubuntu / Gnome?

In tutte le guide (ad esempio alcune su guessnet) ho scoperto che dovevo configurare tutta la mia configurazione di rete (chiavi WPA, DHCP, ...), ma trovo che sia un po 'troppo complicato per un caso d'uso così semplice. Voglio solo disabilitare wlan0quando eth0è collegato.


La risposta a questa domanda varia da computer a computer. Non so se Ubuntu lo consente, ma in genere l'ho trovato un'opzione nel BIOS.
Iszi,

Non intendo completely disableil wlan, intendo disabilitare Ubuntu per provare a connettersi a qualsiasi wlan se è disponibile una connessione cablata. Quindi è una cosa del sistema operativo.
Ingo Fischer,

Risposte:


56

Puoi rilasciare questo script in /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

Non dimenticare in seguito:

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

Ciò cattura i eth*nomi legacy e le nuove "interfacce nominative prevedibili" del kernel che iniziano con ene quindi usano il percorso del bus o l'indirizzo MAC in modo che il nome di ciascuna interfaccia sia lo stesso ad ogni avvio. Questo ha funzionato con l'adattatore USB-C (passthrough) e USB Ethernet con cui ho provato e sono sicuro che funzionerà anche con adattatori integrati.


Il mio wireless stava cercando di connettersi ancora e ancora e stava iniziando a essere davvero irritante. Grazie per questo script, finalmente ha smesso di chiedermi una password di rete. Lo script verrà avviato automaticamente al riavvio del computer?
Joel Lord,

2
@joellord: questo script viene eseguito automaticamente ogni volta che si avvia o si arresta un'interfaccia di rete. Quando si disconnette eth0, il wireless viene abilitato. Quando si collega eth0, il wireless viene disabilitato.
phord,

1
Solido: funziona perfettamente e ha una sceneggiatura minimale.
Air

3
Con nmcli versione 1.0.2 ho dovuto cambiare `nmcli nm wifi` con nmcli r wifi dove rsignifica radio
Alessandro Pezzato

1
Ubuntu 16.04, bash versione 4.3.48, le citazioni devono essere rimosse per far funzionare questo script.
Carles Sala,

8

Dalla v0.9.10 di network-manager, il primo script deve essere modificato

#!/bin/bash

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

Spero che sia d'aiuto!


Questa può probabilmente essere una risposta autonoma. Aiuterebbe enormemente a dire con quale versione di Network Manager si verifica questo cambiamento.
Journeyman Geek


1
Questa soluzione non è corretta, poiché funziona solo se la tua interfaccia lan è chiamata "eth0".
Carles Sala,

4

Semplicemente per l'approccio alla GUI di gnome ...

  1. Fai clic con il pulsante destro del mouse sull'indicatore del sistema di rete nel pannello di GNOME in alto accanto al tuo orologio. (L'indicatore sarà una delle due icone; le frecce su / giù (LAN) o il tradizionale imbuto WiFi. Nota che l'icona su / giù apparirà quando sia LAN e WiFi o solo LAN sono collegati e l'imbuto WiFi appare quando connesso SOLO tramite WiFi. (LAN disconnessa)) - [La LAN supera automaticamente il WiFi. *]

  2. Seleziona "Modifica connessioni ..."

  3. Seleziona la scheda "Wireless".
  4. Fai doppio clic sulla prima connessione nell'elenco e deseleziona la casella "Connetti automaticamente".
  5. Fai clic sul pulsante "Applica ...".
  6. Ripetere l'operazione per ciascuna connessione nell'elenco.

Ciò renderà la rete wireless operativa per le connessioni e le disconnessioni manuali al volo disponibili facendo clic con il pulsante sinistro del mouse sull'icona della rete, senza che la NM tenti di connettersi automaticamente in qualsiasi momento.

Naturalmente è anche possibile disabilitare / abilitare Wireless facendo clic con il tasto destro sull'icona di rete e quindi facendo clic con il tasto sinistro del mouse sulla selezione "Abilita Wireless", abbattendo o alzando efficacemente l'interfaccia Wireless come indicato dalla presenza o meno del segno di spunta.

  • La LAN supera automaticamente il WiFi, non è necessario disabilitare il WiFi. Basta scollegare il cavo Ethernet per trasferire senza problemi la connessione al WiFi e puoi riprenderti e muoverti senza problemi. Allo stesso modo, con la riconnessione della LAN.
  • Mentre la LAN supera il WiFi, NM (Network Manager) troverà ciò che cerchi se ti trovi contemporaneamente su reti diverse e stai lavorando sia online (WiFi) che con un host locale (LAN) o V / V, ad esempio.

2

Solo una supposizione, ma presumo che ifplugd possa aiutare. Potresti farlo spegnere il wifi quando si utilizza il cavo.


Grazie, l'ho già letto. Quello che non mi piace di ifplugd è che devo inserire tutte le mie impostazioni di rete /etc/network/interfaces. Non sono molto bravo nelle cose in rete, quindi mi chiedo dove potrei ottenere tutti i valori necessari dalle mie connessioni esistenti? Spero ancora che ci sia una soluzione più semplice.
Ingo Fischer,

1

Crea due semplici "script", il nome dello script non è importante (uso semplicemente wlan) e presumo che ci sia solo un'interfaccia di rete cablata, e quindi si chiama "eth0" ... Controlla questo con "ifconfig" se non ne sono sicuro. Si noti che questo ha disabilitato del tutto il wireless, non solo wlan0. (Solo un problema se si dispone di più interfacce wlan e si desidera disabilitare solo quelle specifiche)

Questi script potrebbero essere facilmente adattati - dalla logica booleana - a una situazione in cui si hanno due o più interfacce di rete cablate.

Assicurati che questi script siano eseguibili con '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

Ciò abilita / disabilita la connessione wireless nel NetworkManager che di solito si trova come indicatore di sistema nel pannello Gnome.

Puoi anche usare 'ifconfig wlan0 down' o 'ifconfig wlan0 up' invece della linea dbus-send, ma questo dovrebbe essere più user-friendly e interferire meno con le utility di sistema di Ubuntu.

Testato con Ubuntu Desktop 10.10 e dovrebbe funzionare con versioni precedenti o altre distribuzioni utilizzando NetworkManager e dbus.


Questo è probabilmente funzionalmente equivalente alle nmcli radio wifi offrisposte accettate, ma sarei curioso di vedere cosa riportano i registri di sistema quando si chiudono le connessioni in entrambi i modi per vedere se si è più "aggraziati".
dragon788,

1

Questo funziona per me in 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

1

Questo è un miglioramento rispetto alla precedente risposta di Cyril Fessl. (Non ho la reputazione di commento.) Questo funziona per Fedora così, dove le interfacce di rete possono ora avere nomi come wlan0, wlp6s0, em1e enp0s20u2u1). Questa variazione non cerca di abbinare il nome dell'interfaccia, ma cerca piuttosto /sys/class/netinformazioni sul dispositivo. Funziona sul mio laptop Fedora 21 (kernel 3.18) e credo che funzionerà anche su Debian> = 7.

#! / Bin / sh

[$ # -ge 2] || uscita 1

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

IFACE = $ 1
AZIONE = $ 2

mio nome = $ (nome base "$ 0") || uscita 1
log () {logger -p user.info -t "$ {mio nome} [$$]" "$ IFACE / $ ACTION: $ *"; }

se $ DEBUG; poi
    if [-e "/ sys / class / net / $ IFACE / device"]; poi
        log "/ sys / class / net / $ IFACE / dispositivo esistente"
    altro
        log "/ sys / class / net / $ IFACE / dispositivo non esiste"
    fi

    if [-e "/ sys / class / net / $ IFACE / wireless"]; poi
        log "/ sys / class / net / $ IFACE / wireless esiste"
    altro
        log "/ sys / class / net / $ IFACE / wireless non esiste"
    fi
fi

caso $ {AZIONE} in
    su)
        rm -rf $ STATEDIR / $ IFACE

        # Non fare nulla se questo non è un dispositivo fisico.
        Se [ ! -e "/ sys / class / net / $ IFACE / device"]; poi
            log "$ IFACE non è un dispositivo fisico - ignora"
            uscita 0
        fi

        # Non fare nulla se si tratta di un dispositivo wireless.
        if [-d "/ sys / class / net / $ IFACE / wireless"]; poi
            log "$ IFACE non è un dispositivo cablato - ignora"
            uscita 0
        fi

        # Tieni traccia dei dispositivi cablati. Quando scendono, il
        # anche il nodo del dispositivo può andare (ad esempio dongle Ethernet USB),
        # quindi non avremmo modo di dire che tipo di dispositivo fosse.
        toccare $ STATEDIR / $ IFACE

        # Ora spegni il WiFi.
        registro "arresto WiFi"
        nmcli r wifi spento
        ;;
    giù)
        # Verifica se in precedenza abbiamo riconosciuto $ IFACE come a
        # dispositivo fisico, cablato.
        Se [ ! -e $ STATEDIR / $ IFACE]; poi
            log "$ IFACE non è un dispositivo cablato - ignora"
            uscita 0
        fi

        rm -rf $ STATEDIR / $ IFACE

        # Invece di controllare un singolo file, potremmo anche verificare
        # se ci sono ancora file in $ STATEDIR. Se è così, noi
        # ha ancora un dispositivo cablato abilitato ...
        registro "abilitazione WiFi"
        nmcli r wifi attivo
        ;;
esac

1

Se stai già utilizzando tlp per la gestione dell'alimentazione, ha una funzione per farlo.

Devi modificare il tuo file 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=""

"Docked" significa essere collegato all'alimentazione o collegato a una docking station / letter replicator letterale o semplicemente collegato a qualcosa che fornisce una connessione LAN?
dragon788,

0

Per qualsiasi motivo, l'attuale risposta principale di derhoch non funziona per me, anche se dovrebbe. Alcuni degli altri suggerimenti funzionano, ma volevo qualcosa di molto semplice. Quindi, sto usando il seguente script (che ho inserito /etc/NetworkManager/dispatcher.d/per attivare e disattivare il wifi in base allo eth0stato.

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

L' elseaffermazione probabilmente non è necessaria, e potrebbe anche essere un problema in alcune condizioni, ma l'ho lasciata lì per ogni evenienza (senza quell'affermazione, se eth0è inattiva, non si presenta mai).


Qual è il modo systemd per farlo?
Xofo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.