sprawdź, czy interfejs eth0 jest włączony (skonfigurowany)

30

Muszę sprawdzić za pomocą skryptu, czy eth0jest skonfigurowany. Jeśli tak, skrypt nic nie zrobi. W przeciwnym razie zacznie się wlan0. (Nie chcę zarówno eth0i wlan0być w tym samym czasie).

Jaki byłby najłatwiejszy sposób sprawdzenia, czy eth0już działa?

Używam Debian Wheezy

WYJAŚNIENIE:

Chciałbym sprawdzić nie tylko, czy kabel eth0jest podłączony, ale raczej interfejs jest skonfigurowany (tj. Ma ustawiony statyczny adres IP lub otrzymał adres IP DHCP). Jeśli kabel jest podłączony, ale eth0nie jest poprawnie skonfigurowany, chcę zacząćwlan0

użytkownik1968963
źródło
2
Nie jestem pewien, co powiem, ale cat /sys/class/net/ | grep eth0powinienem dać ci łatwo parsowalne dane. Możesz także zrobićsudo ethtool eth0 | grep Link
Kiwy,

Odpowiedzi:

45

Możesz to zrobić na wiele sposobów. Oto przykład:

$ cat /sys/class/net/eth0/operstate
up
Cuonglm
źródło
5
Niestety nie gwarantuje to pełnej konfiguracji interfejsu. Możesz cat /sys/class/net/eth0/carrier, aby sprawdzić sygnał, ale wciąż może nie mieć dzierżawy DHCP itp.
orodbhen
7
ip a show ethX up

Jeśli nic się nie wyświetla, oznacza to, że interfejs jest wyłączony

max
źródło
Ta metoda: „ip a show ethX up” i sprawdzenie wyników nie jest wystarczająca
Joshua Clayton
5
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 

Tak więc tutaj jesteśmy grepwszechobecnym ipnarzędziem stdoutdla linii, która zawiera zarówno nasz interesujący interfejs, jak i zwrot „stan UP” (dzięki @Lekensteyn za wskazanie potrzeby nieco większej szczegółowości niż tylko UP). Używamy tego argumentu ajako krótkiego formularza, addressktóry powinien wystarczyć, aby uzyskać listę wszystkich skonfigurowanych kart sieciowych w systemie.

Jedną z zalet używania ipmoże być to, że naprawdę powinien być dostępny wszędzie - w ten sposób na przykład często konfiguruję urządzenia sieciowe mojego telefonu z Androidem.

Służą :colonsone do unikania częściowych dopasowań - w ten sposób gwarantujemy dopasowanie do, eth0a nie do innych możliwych someothereth0lub eth007.

Dzięki @RaphaelAhrens za popychanie mnie do poprawności i wyjaśnianie mojego rozwiązania.

EDYTOWAĆ:

Aby obsłużyć obecne wymagania, możesz:

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

Powyżej wydrukuje adres IP CIDR tylko wtedy, gdy twój cel $ifjest włączony , podłączony i ma go. W przypadku ipv6 rozwiązanie jest równie proste z niewielkimi modyfikacjami.

Jeśli ci się nie podoba, sedmożesz osiągnąć podobne wyniki z innym |pipe ... grepi dodając -Aopcję kontekstową do pierwszego grep- ale lubię sed.

mikeserv
źródło
1
Powinieneś wyjaśnić, co robisz. Aby każdy mógł skorzystać z Twojej odpowiedzi.
Raphael Ahrens
5
To jest niewystarczające. Wyjście zawiera również UPwtedy, gdy urządzenie jest w górę, ale nie jest podłączony kabel: 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000. Można także określić urządzenie, aby uniknąć fałszywych alarmów: ip addr show dev eth0.
Lekensteyn
0

Inne metody nie działają, ale ta działa (przynajmniej na Ubuntu):

while true; do
    ip route | grep "linkdown"
    if [ $? -eq 0 ]; then
        sleep 1  # network not yet up
    else
        break   # network up
    fi
done
Xinthose
źródło
Na ip routeDebian Stretch nie ma „linkdown” do grep .
Ingo