controlla se l'interfaccia eth0 è attiva (configurata)


30

Devo verificare con uno script, se eth0è configurato. In tal caso, la sceneggiatura non farà nulla. Altrimenti inizierà wlan0. (Non voglio entrambi eth0e wlan0alzarmi allo stesso tempo).

Quale sarebbe il modo più semplice per verificare, se eth0è già attivo?

Sto usando Debian Wheezy

UNA PRECISAZIONE:

Vorrei verificare non solo che il cavo eth0sia collegato, ma piuttosto che l'interfaccia sia configurata (cioè ha un IP statico impostato o ha ricevuto un IP DHCP). Se il cavo è collegato, ma eth0non è configurato correttamente, voglio iniziarewlan0


2
Non sono sicuro di quello che sto per dire, ma cat /sys/class/net/ | grep eth0dovrei fornirti dati facilmente analizzabili. Potresti anche faresudo ethtool eth0 | grep Link
Kiwy il

Risposte:


45

Puoi farlo in molti modi. Ecco un esempio:

$ cat /sys/class/net/eth0/operstate
up

5
Sfortunatamente, ciò non garantisce che l'interfaccia sia completamente configurata. Puoi cat /sys/class/net/eth0/carrier, per verificare la presenza di un segnale, ma potrebbe ancora non avere ancora un contratto di locazione DHCP, ecc.
orodbhen

7
ip a show ethX up

Se non viene visualizzato nulla, l'interfaccia non è attiva


Questo metodo: "ip a show ethX up" e verifica l'output, non è sufficiente
Joshua Clayton,

5
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 

Quindi qui lo strumento greponnipresente ipè stdoutper una linea che contiene sia la nostra interfaccia di interesse che la frase "state UP" (grazie a @Lekensteyn per aver sottolineato la necessità di un po 'più di specificità che semplicemente UP). Usiamo l'argomento acome forma abbreviata per addresse questo dovrebbe essere sufficiente per ottenere un elenco di tutte le schede di rete configurate nel sistema.

Uno dei vantaggi dell'utilizzo ippotrebbe essere che dovrebbe essere davvero disponibile ovunque - è come configuro comunemente i dispositivi di rete del mio telefono Android, ad esempio.

Il :colonsvengono utilizzati per evitare le corrispondenze parziali - in questo modo possiamo garantire una corrispondenza per eth0al contrario di un altrimenti possibile someothereth0o eth007.

Grazie @RaphaelAhrens per avermi spinto verso la correttezza e per aver spiegato la mia soluzione.

MODIFICARE:

Per gestire i requisiti attuali è possibile:

ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'

Quanto sopra stamperà un indirizzo IP CIDR solo se la tua destinazione $ifè SU, collegata e ne ha una. Per ipv6 la soluzione è altrettanto semplice con solo piccole modifiche.

Se non ti piace sedpotresti ottenere risultati simili con un altro |pipe ... grepe aggiungere -Aun'opzione di contesto al primo grep, ma a me piace sed.


1
Dovresti spiegare cosa stai facendo. In modo che tutti possano beneficiare della tua risposta.
Raphael Ahrens,

5
Questo è insufficiente. L'output contiene anche UPse il dispositivo è attivo, ma nessun cavo è collegato: 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000. È inoltre possibile specificare il dispositivo per evitare falsi positivi: ip addr show dev eth0.
Lekensteyn,

0

Gli altri metodi non funzionano, ma questo funziona (almeno su Ubuntu):

while true; do
    ip route | grep "linkdown"
    if [ $? -eq 0 ]; then
        sleep 1  # network not yet up
    else
        break   # network up
    fi
done

Non esiste un "linkdown" con cui eseguire il grep ip routesu Debian Stretch.
Ingo
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.