Wie erkenne ich den physischen Verbindungsstatus eines Netzwerkkabels / -verbinders?


145

In einer Linux-Umgebung muss ich den physischen Verbindungs- oder Trennungsstatus eines RJ45-Anschlusses an seinem Sockel erkennen. Verwenden Sie vorzugsweise nur BASH-Skripte.

Die folgenden Lösungen, die auf anderen Websites vorgeschlagen wurden, funktionieren NICHT für diesen Zweck:

  1. Verwenden von 'ifconfig' - da möglicherweise ein Netzwerkkabel angeschlossen ist, das Netzwerk jedoch nicht ordnungsgemäß konfiguriert ist oder derzeit nicht aktiv ist.
  2. Pingen eines Hosts - da sich das Produkt in einem LAN befindet, das eine unbekannte Netzwerkkonfiguration und unbekannte Hosts verwendet.

Gibt es nicht einen Status, der im / proc-Dateisystem verwendet werden kann (alles andere ist dort)?

Wie soll die Linux-Welt eine eigene Version der Windows-Blase haben, die aus der Symbolleiste erscheint und anzeigt, dass Sie gerade das Netzwerkkabel abgezogen haben?


Kent Fredric und Lothar , beide Antworten erfüllen meine Bedürfnisse ... vielen Dank! Welches ich verwenden werde ... Ich weiß es immer noch nicht.

Ich glaube, ich kann euch nicht beide als die richtige Antwort nennen? Und es ist wahrscheinlich fair für Sie, dass ich einen wähle. Eine Münze werfen, denke ich? Noch einmal Danke!

Antworten:


228

Sie möchten sich die Knoten in ansehen

/ sys / class / net /

Ich habe mit meinen experimentiert:

Kabel eingesteckt:

eth0/carrier:1
eth0/operstate:unknown

Draht entfernt:

eth0/carrier:0
eth0/operstate:down

Draht wieder eingesteckt:

eth0/carrier:1
eth0/operstate:up

Seitentrick: Alle Eigenschaften auf einmal auf einfache Weise ernten:

grep "" eth0/* 

Dies bildet eine schöne Liste von key:valuePaaren.


8
Beachten Sie, dass, wie Marco unten sagt, die Schnittstelle aktiv sein muss (auch wenn sie nicht konfiguriert ist), um diese Werte abzufragen.
Jamie Kitson

11
grep "" eth0 / * ist so elegant und einfach, danke! :) Mit dem Schalter -s beschwert sich grep nicht über die Verzeichnisse.
Ray

2
Ich bevorzuge grep -H . eth0/*:: Diese Peitsche leere Zeilen und drucken Eintragsnamen mit gehören zu jeder Zeile.
F. Hauri

Die Fehler über Verzeichnisse von grep können ignoriert werden mit:grep -s "" eth0/*
mrtumnus

Beachten Sie, dass die Schnittstelle aktiv sein muss. Siehe Marcos Antwort unten. In meinem System ist eth0 nicht standardmäßig festgelegt und mein Programm generiert zufällig eine IP-Adresse dafür. Ich erhalte einen "Ungültiges Argument" -Fehler beim Catten des Trägers
VocoJax

84

Sie können ethtool verwenden :

$ sudo ethtool eth0
Settings for eth0:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes:  10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Advertised auto-negotiation: Yes
    Speed: 1000Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: on
    Supports Wake-on: umbg
    Wake-on: g
    Current message level: 0x00000007 (7)
    Link detected: yes

Um nur den Linkstatus zu erhalten, können Sie grep verwenden:

$ sudo ethtool eth0 | grep Link
    Link detected: yes

IP-Link | grep BROADCAST | cut -d ':' -f 2 | während ich lese; Echo $ i; ethtool $ i | grep Link; fertig
Bryan Hunt

3
Beachten Sie, dass, wie Marco unten sagt, die Schnittstelle aktiv sein muss (auch wenn sie nicht konfiguriert ist), um diese Werte abzufragen.
Jamie Kitson

das ist fantastisch! Ich hatte eine Möglichkeit zu überprüfen, ob Ethernet verfügbar ist, ob Ethernet aktiviert ist, ob Ethernet verbunden ist, aber keine Möglichkeit zu überprüfen, ob das tatsächliche Kabel angeschlossen war. grep Linkmacht es. Danke dir!!
18.

Ich arbeite hier nicht. Ubuntu 16.04 auf HP Hardware. Nicht konfigurierte Schnittstellen sind "keine Verbindung", selbst wenn sie zum upStatus gezwungen werden .
0xF2

26

Verwenden Sie 'ip monitor', um Änderungen des Verbindungsstatus von REAL TIME zu erhalten.


3
In meinem Fall ist dies die einzige Antwort , die ... arbeitete / sys / class / net / eth0 / Träger noch zeigt , 1wenn mein Kabel während getrennt ist ip monitortatsächlich zeigt etwas
Tim Tisdall

Man könnte sich bei einigen bedanken, die diese Methode erweitert haben, Peter. So etwas wie ein Beispiel, das die ursprüngliche Frage nach dem Status des Kabelsteckers beantwortet.
Sopalajo de Arrierez

17

cat /sys/class/net/ethX ist bei weitem die einfachste Methode.

Die Schnittstelle muss jedoch aktiv sein, sonst wird ein ungültiger Argumentfehler angezeigt.

So zuerst:

ifconfig ethX up

Dann:

cat /sys/class/net/ethX

4
Versuchen Sie "cat / sys / class / net / eth [n] / operstate", wobei [n] die eth-Gerätenummer ist.
pmont

Dies sagt Ihnen nur, ob eth [n] aktiv ist. Wenn es deaktiviert ist, wird nicht angezeigt, ob das Kabel angeschlossen ist oder nicht.
Brice

@Brice, in der Tat möchten Sie die Datei ethX/carrier1 überprüfen, wenn der "Träger" erkannt wird, was bedeutet, dass ein Kabel angeschlossen ist und Daten überträgt ...
Alexis Wilke

Dies funktionierte bei mir mithilfe von Process Runtime Exec-Befehlen, um zu überprüfen, ob das Kabel in Android angeschlossen ist.
Arlyn

Oder suchen Sie nach ifconfig ethX nach ifconfig ethX und suchen Sie nach RUNNING.
craig65535

8

Auf der niedrigen Ebene können diese Ereignisse über rtnetlink- Sockets ohne Abfrage abgefangen werden . Randnotiz: Wenn Sie rtnetlink verwenden, müssen Sie mit udev zusammenarbeiten. Andernfalls kann Ihr Programm verwirrt werden, wenn udev eine neue Netzwerkschnittstelle umbenennt.

Das Problem bei Netzwerkkonfigurationen mit Shell-Skripten besteht darin, dass Shell-Skripte für die Ereignisbehandlung schrecklich sind (z. B. wenn ein Netzwerkkabel ein- und ausgesteckt wird). Wenn Sie etwas Stärkeres benötigen, schauen Sie sich meine NCD-Programmiersprache an , eine Programmiersprache für Netzwerkkonfigurationen.

Zum Beispiel ein einfaches NCD-Skript, das "Kabel rein" und "Kabel raus" nach stdout druckt (vorausgesetzt, die Schnittstelle ist bereits aktiv):

process foo {
    # Wait for device to appear and be configured by udev.
    net.backend.waitdevice("eth0");
    # Wait for cable to be plugged in.
    net.backend.waitlink("eth0");
    # Print "cable in" when we reach this point, and "cable out"
    # when we regress.
    println("cable in");   # or pop_bubble("Network cable in.");
    rprintln("cable out"); # or rpop_bubble("Network cable out!");
                           # just joking, there's no pop_bubble() in NCD yet :)
}

(intern net.backend.waitlink()verwendet rtnetlink und net.backend.waitdevice()verwendet udev)

Die Idee von NCD ist, dass Sie es ausschließlich zum Konfigurieren des Netzwerks verwenden, sodass normalerweise Konfigurationsbefehle dazwischen kommen, wie z.

process foo {
    # Wait for device to appear and be configured by udev.
    net.backend.waitdevice("eth0");
    # Set device up.
    net.up("eth0");
    # Wait for cable to be plugged in.
    net.backend.waitlink("eth0");
    # Add IP address to device.
    net.ipv4.addr("eth0", "192.168.1.61", "24");
}

Der wichtige Teil zu beachten ist , dass die Ausführung erlaubt ist Regress ; Im zweiten Beispiel wird beispielsweise die IP-Adresse automatisch entfernt, wenn das Kabel herausgezogen wird.


4

Es gibt zwei Dämonen, die diese Ereignisse erkennen:

ifplugd und netplugd


Ich benutze das ifplugstatusTool vom ifplugdDaemon. Sie brauchen keine Argumente, geben Sie einfach ein ifplugstatusund Sie erhalten die gesamte Netzwerkkarte als angeschlossen oder nicht angeschlossen.
Sopalajo de Arrierez

3

Die meisten modernen Linux-Distributionen verwenden hierfür NetworkManager . Sie können D-BUS verwenden, um auf die Ereignisse zu warten.

Wenn Sie möchten, dass ein Befehlszeilentool den Status überprüft, können Sie ihn auch verwenden mii-tool, sofern Sie an Ethernet denken.


3
mii-tool wurde von ethtool abgelöst. mii-tool kennt keine GigE-Links.
JimB

Darüber hinaus haben die meisten Server manuell konfigurierte Adapter, die von NM ignoriert werden.
JimB

1
mii-toolscheint der einzige Befehl zu sein, der über den Verbindungsstatus berichten kann, wenn die Schnittstelle nicht verfügbar ist.
donothings erfolgreich

2

Ich benutze diesen Befehl, um zu überprüfen, ob ein Draht angeschlossen ist:

cd /sys/class/net/
grep "" eth0/operstate

Wenn das Ergebnis nach oben oder unten geht. Manchmal zeigt es unbekannt, dann müssen Sie überprüfen

eth0/carrier

Es zeigt 0 oder 1


2

Einige Präzisionen und Tricks

  1. Ich mache das alles als normaler Benutzer (nicht root )

  2. Besorgen Sie sich Infos von dmesg

    Die Verwendung dmesgist eines der ersten Dinge, die Sie tun müssen, um den aktuellen Status des Systems abzufragen :

    dmesg | sed '/eth.*Link is/h;${x;p};d'
    

    könnte so etwas beantworten wie:

    [936536.904154] e1000e: eth0 NIC Link is Down
    

    oder

    [936555.596870] e1000e: eth0 NIC Link is Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
    

    Je nach Status kann die Meldung je nach verwendeter Hardware und verwendeten Treibern variieren.

    Nota: Dies könnte schriftlich erfolgen, dmesg|grep eth.*Link.is|tail -n1aber ich bevorzuge die Verwendung sed.

    dmesg | sed '/eth.*Link is/h;${x;s/^.*Link is //;p};d'
    Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
    
    dmesg | sed '/eth.*Link is/h;${x;s/^.*Link is //;p};d'
    Down
    
  3. Testen Sie herum /sys Pseudo-Dateisystem

    Das Lesen oder Schreiben unter /syskann Ihr System beschädigen , insbesondere wenn es als ausgeführt wird Root ausgeführt wird ! Du wurdest gewarnt ;-)

    Dies ist eine Pooling-Methode, keine echte Ereignisverfolgung .

    cd /tmp
    grep -H . /sys/class/net/eth0/* 2>/dev/null >ethstate
    while ! read -t 1;do
        grep -H . /sys/class/net/eth0/* 2>/dev/null |
            diff -u ethstate - |
            tee >(patch -p0) |
            grep ^+
      done
    

    Könnte so etwas wie rendern (je nachdem, ob Sie den Stecker gezogen und wieder eingesteckt haben, je nachdem):

    +++ -   2016-11-18 14:18:29.577094838 +0100
    +/sys/class/net/eth0/carrier:0
    +/sys/class/net/eth0/carrier_changes:9
    +/sys/class/net/eth0/duplex:unknown
    +/sys/class/net/eth0/operstate:down
    +/sys/class/net/eth0/speed:-1
    +++ -   2016-11-18 14:18:48.771581903 +0100
    +/sys/class/net/eth0/carrier:1
    +/sys/class/net/eth0/carrier_changes:10
    +/sys/class/net/eth0/duplex:full
    +/sys/class/net/eth0/operstate:up
    +/sys/class/net/eth0/speed:100
    

    (Schlagen Enter Zum Verlassen der Schleife drücken)

    Nota: Dies erfordert patch muss installiert sein.

  4. In Ordnung, da muss schon was dran sein ...

    Abhängig von der Linux-Installation können Sie if-upund hinzufügenif-down Skripte auf diese Art von Ereignissen reagieren zu können.

    Auf Debian- Basis (wie Ubuntu ) können Sie Ihre Skripte in speichern

    /etc/network/if-down.d
    /etc/network/if-post-down.d
    /etc/network/if-pre-up.d
    /etc/network/if-up.d
    

    siehe man interfacesfür mehr Infos.


Vielen Dank für Ihre Kommentare und Beiträge zu diesem Thema. Sie erkennen jedoch, dass es sich um "automatisierte" Skripte handelt. In Punkt 2 ist das ein wirklich großes Problem , wenn Sie "Ausgabe" oder "eine andere Ausgabe" sagen oder wenn Sie " Je nach Status, Nachricht kann je nach verwendeter Hardware und verwendeten Treibern " sagen . Die Ausgabe muss konsistent sein, damit die Produktionsskripte nicht mehr funktionieren. Aber es sind trotzdem gute Informationen, danke.
Jeach

@Jeach Die Ausgabe kann variieren. Dies bedeutet, dass Sie möglicherweise einen anderen Treiber als verwendene1000 und die Abstimmung zu einem anderen Zeitpunkt als erfolgen kann936555.596870 , aber Sie werden es immer sehen NIC Link is.
F. Hauri

2

Sie können ifconfig verwenden.

# ifconfig eth0 up
# ifconfig eth0

Wenn der Eintrag RUNNING anzeigt, ist die Schnittstelle physisch verbunden. Dies wird unabhängig davon angezeigt, ob die Schnittstelle konfiguriert ist.

Dies ist nur ein weiterer Weg, um die Informationen zu erhalten /sys/class/net/eth0/operstate.


Du hast meine Stunden gerettet !!
ADITYA VALLURU

1

auf Arch Linux. (Ich bin mir bei anderen Distributionen nicht sicher) Sie können den Operstate anzeigen. Dies wird angezeigt, wenn eine Verbindung besteht, oder deaktiviert, wenn der Operstate nicht weiterlebt

/sys/class/net/(interface name here)/operstate
#you can also put watch 
watch -d -n -1 /sys/class/net/(interface name here)/operstate

1
tail -f /var/log/syslog | grep -E 'link (up|down)'

oder für mich wird schneller:

tail -f /var/log/syslog | grep 'link \(up\|down\)'

Es wird die Syslog-Datei abhören.

Ergebnis (wenn die Verbindung trennen und nach 4 Sekunden erneut verbinden):

Jan 31 13:21:09 user kernel: [19343.897157] r8169 0000:06:00.0 enp6s0: link down
Jan 31 13:21:13 user kernel: [19347.143506] r8169 0000:06:00.0 enp6s0: link up

1

Irgendwie, wenn Sie überprüfen möchten, ob das Ethernet-Kabel nach dem Commend in Linux eingesteckt ist: "ifconfig eth0 down". Ich finde eine Lösung: Verwenden Sie das Tool ethtool.

#ethtool -t eth0
The test result is PASS
The test extra info:
Register test  (offline)         0
Eeprom test    (offline)         0
Interrupt test (offline)         0
Loopback test  (offline)         0
Link test   (on/offline)         0

Wenn ein Kabel angeschlossen ist, ist der Verbindungstest 0, andernfalls 1.


0

Ich habe mein OpenWRT-erweitertes Gerät als Repeater verwendet (der Funktionen für virtuelles Ethernet und drahtloses LAN hinzufügt) und festgestellt, dass die Träger- und Opstate-Werte / sys / class / net / eth0 unzuverlässig sind. Ich habe auch mit /sys/class/net/eth0.1 und /sys/class/net/eth0.2 herumgespielt und (zumindest nach meiner Feststellung) keine zuverlässige Möglichkeit gefunden, um festzustellen, dass etwas physisch angeschlossen war und über irgendetwas gesprochen wurde der Ethernet-Ports. Ich habe einen etwas groben, aber scheinbar zuverlässigen Weg gefunden, um festzustellen, ob seit dem letzten Neustart / Poweron-Status etwas angeschlossen war (was genau so funktionierte, wie ich es in meinem Fall brauchte).

ifconfig eth0 | grep -o 'RX packets:[0-9]*' | grep -o '[0-9]*'

Sie erhalten eine 0, wenn nichts eingesteckt wurde, und etwas> 0, wenn etwas eingesteckt wurde (auch wenn es eingesteckt und seitdem entfernt wurde) seit dem letzten Einschalt- oder Neustartzyklus.

Hoffe das hilft wenigstens jemandem!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.