überprüfe ob die Schnittstelle eth0 aktiv ist (konfiguriert)

30

Ich muss mit einem Skript prüfen, ob eth0konfiguriert ist. Wenn ja, wird das Skript nichts tun. Sonst geht es los wlan0. (Ich möchte nicht beide eth0und wlan0gleichzeitig wach sein).

Was wäre der einfachste Weg, um zu überprüfen, ob eth0bereits up ist?

Ich benutze Debian Wheezy

KLÄRUNG:

Ich möchte nicht nur überprüfen, ob das Kabel eth0eingesteckt ist, sondern auch, ob die Schnittstelle konfiguriert ist (dh ob eine statische IP eingestellt ist oder eine DHCP-IP empfangen wurde). Wenn das Kabel eingesteckt, aber eth0nicht richtig konfiguriert ist, möchte ich anfangenwlan0

user1968963
quelle
2
Ich bin mir nicht sicher, was ich sagen werde, aber ich cat /sys/class/net/ | grep eth0sollte Ihnen einfach analysierbare Daten geben. Sie könnten auch tunsudo ethtool eth0 | grep Link
Kiwy

Antworten:

45

Sie können es auf viele Arten tun. Hier ein Beispiel:

$ cat /sys/class/net/eth0/operstate
up
cuonglm
quelle
5
Dies garantiert leider nicht, dass die Schnittstelle vollständig konfiguriert ist. Sie können cat /sys/class/net/eth0/carrier, um nach einem Signal zu
suchen
7
ip a show ethX up

Wenn nichts angezeigt wird, ist Ihre Benutzeroberfläche ausgefallen

max
quelle
Diese Methode: "ip a show ethX up" und auf Ausgabe prüfen, ist nicht ausreichend
Joshua Clayton
5
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 

Hier ist also grepdas allgegenwärtige ipWerkzeug stdoutfür eine Zeile, die sowohl unsere interessierende Schnittstelle als auch den Ausdruck "state UP" enthält (danke an @Lekensteyn, der darauf hingewiesen hat, dass ein wenig mehr Spezifität als nur erforderlich ist UP). Wir verwenden das Argument aals Kurzform für addressund das sollte ausreichen, um eine Auflistung aller konfigurierten Netzwerkkarten im System zu erhalten.

Ein Vorteil der Verwendung ipkönnte sein, dass sie wirklich überall verfügbar sein sollte - so konfiguriere ich zum Beispiel die Netzwerkgeräte meines Android-Telefons.

Sie :colonswerden verwendet, um partielle Übereinstimmungen zu vermeiden - auf diese Weise garantieren wir eine Übereinstimmung für eth0im Gegensatz zu einem anderen möglichen someothereth0oder eth007.

Vielen Dank an @RaphaelAhrens, der mich zur Korrektheit gedrängt und meine Lösung erklärt hat.

BEARBEITEN:

Um den aktuellen Anforderungen gerecht zu werden, können Sie:

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

Die oben wird nur eine CIDR IP - Adresse drucken , wenn Ihr Ziel $ifist hoch, eingesteckt und hat einen. Für ipv6 ist die Lösung mit nur geringfügigen Änderungen genauso einfach.

Wenn Sie nicht mögen sed, könnten Sie ähnliche Ergebnisse mit einem anderen erzielen |pipe ... grepund -Adem ersten eine Kontextoption hinzufügen grep- aber ich mag sed.

mikeserv
quelle
1
Sie sollten erklären, was Sie tun. Damit jeder von Ihrer Antwort profitieren kann.
Raphael Ahrens
5
Das ist nicht ausreichend. Die Ausgabe enthält auch , UPwenn das Gerät ist, aber kein Kabel angeschlossen ist : 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000. Sie können auch das Gerät angeben , Fehlalarme zu vermeiden: ip addr show dev eth0.
Lekensteyn
0

Die anderen Methoden funktionieren nicht, aber diese (zumindest unter 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
quelle
Es gibt keinen "Linkdown", mit dem man ip routeauf Debian Stretch grepen kann .
Ingo