it-swarm.com.de

Wie kann der physikalische Verbindungsstatus eines Netzwerkkabels/-verbinders ermittelt werden?

In einer Linux-Umgebung muss ich den physisch verbundenen oder getrennten Zustand eines RJ45-Steckers an seinem Sockel erkennen. Vorzugsweise nur mit BASH-Scripting.

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

  1. 'Ifconfig' verwenden - da ein Netzwerkkabel angeschlossen ist, das Netzwerk jedoch nicht ordnungsgemäß konfiguriert ist oder gerade nicht aktiv ist.
  2. Ping an einen Host - da sich das Produkt in einem LAN befindet und eine unbekannte Netzwerkkonfiguration und unbekannte Hosts verwendet.

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

Wie soll die Linux-Welt ihre eigene Version der Windows-Blase haben, die in der Symbolleiste angezeigt wird, um anzuzeigen, dass Sie gerade das Netzwerkkabel abgezogen haben?


Kent Fredric und lothar, beide deine Antworten befriedigen mein Bedürfnis ... vielen Dank! Welche ich verwenden werde ... ich weiß es immer noch nicht.

Ich vermute, ich kann Sie nicht beide als richtige Antwort aufgeben. Und es ist wahrscheinlich fair für dich, dass ich einen auswähle. Ich denke mal, eine Münze werfen? Noch einmal Danke!

125
Jeach

Sie möchten die Knoten in sehen 

/sys/class/net /

Ich habe mit meinem experimentiert: 

Draht eingesteckt: 

eth0/carrier:1
eth0/operstate:unknown

Draht entfernt: 

eth0/carrier:0
eth0/operstate:down

Draht wieder eingesteckt:

eth0/carrier:1
eth0/operstate:up

Side Trick: Alle Eigenschaften auf eine einfache Art und Weise ernten: 

grep "" eth0/* 

Dies bildet eine schöne Liste von key:value Paaren. 

198
Kent Fredric

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 Link-Status zu erhalten, können Sie grep verwenden:

$ Sudo ethtool eth0 | grep Link
    Link detected: yes
77
lothar

Verwenden Sie 'ip monitor', um die Änderungen des REAL TIME-Verbindungsstatus anzuzeigen.

24
Peter Quiring

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

Die Schnittstelle muss jedoch aktiv sein, andernfalls erhalten Sie einen ungültigen Argumentfehler.

So zuerst:

ifconfig ethX up

Dann:

cat /sys/class/net/ethX
15
Marco

Auf der niedrigen Ebene können diese Ereignisse mit rtnetlink sockets ohne Abruf abgefangen werden. Randbemerkung: Wenn Sie rtnetlink verwenden, müssen Sie mit udev zusammenarbeiten. Andernfalls kann das Programm verwirrt werden, wenn udev eine neue Netzwerkschnittstelle umbenennt.

Das Problem beim Durchführen von Netzwerkkonfigurationen mit Shell-Skripts besteht darin, dass Shell-Skripts für die Ereignisbehandlung schrecklich sind (z. B. wenn ein Netzwerkkabel ein- und ausgesteckt wird). Wenn Sie etwas Stärkeres benötigen, werfen Sie einen Blick auf meine NCD-Programmiersprache , eine für Netzwerkkonfigurationen entwickelte Programmiersprache.

Zum Beispiel ein einfaches NCD-Skript, das "cable in" und "cable out" an 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 verwendet net.backend.waitlink() rtnetlink und net.backend.waitdevice() udev)

Die Idee von NCD ist, dass Sie es ausschließlich zur Konfiguration des Netzwerks verwenden. Normalerweise würden Konfigurationsbefehle dazwischenkommen, 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");
}

Zu beachten ist, dass die Ausführung Regression erlaubt ist; Im zweiten Beispiel wird die IP-Adresse beispielsweise automatisch entfernt, wenn das Kabel herausgezogen wird.

8
Ambroz Bizjak

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

ifplugd und netplugd

4
germanjaber

Ich verwende diesen Befehl, um zu prüfen, ob ein Draht angeschlossen ist:

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

Wenn das Ergebnis nach oben oder unten ist. Manchmal zeigt es sich 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. Informationen aus dmesg holen

    Die Verwendung von dmesg ist eine der ersten Aufgaben zur Abfrage aktueller Status des Systems:

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

    könnte 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 abhängig von der verwendeten Hardware und den verwendeten Treibern variieren.

    Hinweis: Dies könnte durch dmesg|grep eth.*Link.is|tail -n1 erfolgen, ich bevorzuge jedoch die Verwendung von 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 das Pseudo-Dateisystem /sys

    Das Lesen oder Schreiben unter /sys könnte Ihr System beschädigen, insbesondere wenn es als 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 ungefähr so ​​aussehen (je nachdem, ob Sie den Stecker gezogen und wieder eingesteckt haben):

    +++ -   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 Schleife verlassen)

    Hinweis: Hierfür muss patch installiert sein.

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

    Abhängig von der Linux-Installation können Sie if-up- und if-down-Skripts hinzufügen, um 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
    

    weitere Informationen finden Sie unter man interfaces.

2
F. Hauri

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

Wenn Sie möchten, dass ein Befehlszeilentool den Status überprüft, können Sie auch mii-tool verwenden, wenn Sie sich für Ethernet entscheiden.

2
andri

auf Arch Linux. (Ich bin mir nicht sicher, in anderen Distributionen) Sie können den Betriebszustand anzeigen. was angezeigt wird, wenn es angeschlossen ist oder nicht, wenn der Betriebszustand nicht besteht 

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

Sie can verwenden ifconfig.

# ifconfig eth0 up
# ifconfig eth0

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

Dies ist nur eine weitere Möglichkeit, die Informationen in /sys/class/net/eth0/operstate abzurufen.

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

oder für mich schneller bekommt:

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

Es wird die Syslog-Datei abhören.

Ergebnis (wenn 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
0
Dima

Ich habe mein mit OpenWRT verbessertes Gerät als Repeater verwendet (wodurch virtuelle Ethernet- und Wireless-LAN-Funktionen hinzugefügt werden). Ich habe festgestellt, dass die Werte für/sys/class/net/eth0 carrier und opstate unzuverlässig sind. Ich spielte mit /sys/class/net/eth0.1 und /sys/class/net/eth0.2 sowie mit (zumindest zu meinem Ergebnis) keinen zuverlässigen Weg, um herauszufinden, dass etwas physisch angeschlossen war und über irgendetwas sprach der Ethernet-Ports. Ich habe ein wenig grobe, aber scheinbar zuverlässige Methode gefunden, um herauszufinden, ob seit dem letzten Neustart/Poweron-Status etwas angeschlossen war (was in meinem Fall genau so funktionierte, wie ich es brauchte).

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

Sie erhalten eine 0, wenn nichts angeschlossen wurde, und etwas> 0, wenn etwas angeschlossen wurde (auch wenn es eingesteckt wurde und seitdem entfernt wurde), seit dem letzten Einschalten oder Neustart.

Hoffe das hilft wenigstens jemandem raus!

0
JxAxMxIxN