Wie der physischen verbundenen Zustand eines Netzwerkkabel / Stecker erkennen?
-
03-07-2019 - |
Frage
In einer Linux-Umgebung, ich brauche den physischen verbunden oder getrennt Zustand eines RJ45-Stecker an die Steckdose zu erkennen. Vorzugsweise werden nur BASH Scripting.
Die folgenden Lösungen, die auf anderen Seiten vorgeschlagen wurden für diesen Zweck nicht funktionieren:
- Verwenden von ‚ifconfig‘ -., Da ein Netzwerkkabel angeschlossen werden können, aber das Netzwerk nicht richtig konfiguriert oder nicht aktuell bis
- Ping ein Host -., Da das Produkt innerhalb eines LAN mit einer unbekannten Netzwerkkonfiguration und unbekannte Hosts wird
Gibt es nicht einigen Zustand, der in dem / proc-Dateisystem verwendet werden kann (alles anderes ist da drin)?
Wie wird die Linux-Welt annehmen, ihre eigene Version der Windows-Blase haben, die aus der Taskleiste öffnet sich das anzeigt, dass Sie gerade das Netzwerkkabel ausgesteckt?
Kent Fredric und lothar , die beide Ihre Antworten befriedigen mein Bedürfnis ... vielen Dank! Welches ich verwende ... Ich weiß noch nicht.
Ich glaube, ich kann dich nicht beide als die richtige Antwort hinstellen? Und es ist wahrscheinlich Messe für Sie, dass ich ein wähle. Flip a coin ich denke? Nochmals vielen Dank!
Lösung
Sie möchten an den Knoten suchen in
/sys/class/net/
ich mit meiner experimentiert:
Draht Angeschlossen:
eth0/carrier:1
eth0/operstate:unknown
Draht entfernt:
eth0/carrier:0
eth0/operstate:down
Draht Angeschlossen wieder:
eth0/carrier:1
eth0/operstate:up
Side Trick: Ernte alle Eigenschaften auf einmal den einfachen Weg:
grep "" eth0/*
Dies bildet eine schöne Liste von key:value
Paaren.
Andere Tipps
Sie können mit ethtool :
$ 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 erhalten den Link-Status Sie grep verwenden können:
$ sudo ethtool eth0 | grep Link
Link detected: yes
Mit 'IP Monitor' REAL TIME Verbindungsstatusänderungen zu erhalten.
cat /sys/class/net/ethX
ist bei weitem die einfachste Methode.
Die Schnittstelle hat bis obwohl sein, sonst werden Sie ein ungültiges Argument Fehler.
Also zuerst:
ifconfig ethX up
Dann:
cat /sys/class/net/ethX
Auf dem niedrigen Niveau können diese Ereignisse werden mit gefangen rtnetlink Steckdosen, ohne Polling. Randbemerkung: Wenn Sie rtnetlink verwenden, haben Sie mit udev zusammen arbeiten, oder Ihr Programm kann verwirrt, wenn udev eine neue Netzwerk-Schnittstelle umbenennt
.Das Problem mit Netzwerkkonfigurationen mit Shell-Skripten zu tun ist, dass Shell-Skripten für das Ereignis schrecklich sind Handhabung (wie ein Netzwerkkabel in der und aus angeschlossen werden). Wenn Sie etwas stärker brauchen, werfen Sie einen Blick auf meine NCD Programmiersprache , ein Programmiersprache entwickelt für Netzwerkkonfigurationen.
Zum Beispiel kann ein einfacher NCD-Skript, das „Kabel in“ und „Kabeln out“ auf der Standardausgabe gedruckt wird (vorausgesetzt, die Schnittstelle ist bereits oben):
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 der NCD ist, dass Sie es verwenden ausschließlich das Netzwerk zu konfigurieren, so normal, Konfigurationsbefehle kommen würden zwischen, wie zum Beispiel:
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, dass die Ausführung zu beachten ist, ist mit erlaubt Regress ; im zweiten Beispiel, zum Beispiel, wenn das Kabel herausgezogen wird, wird die IP-Adresse automatisch entfernt werden.
Es gibt zwei Dämonen, die diese Ereignisse erkennen:
ifplugd und netplugd
Die meisten modernen Linux-Distributionen verwenden Network für diese. Sie könnten D-BUS verwenden für die Ereignisse zu hören.
Wenn Sie ein Kommandozeilen-Tool wollen den Status zu überprüfen, können Sie auch mii-tool
verwenden, da Sie Ethernet im Sinn haben.
Ich verwende diesen Befehl, um einen Draht überprüfen angeschlossen ist:
cd /sys/class/net/
grep "" eth0/operstate
Wenn das Ergebnis nach oben oder unten sein. Manchmal zeigt es unbekannt, dann müssen Sie prüfen,
eth0/carrier
Es zeigt 0 oder 1
Einige Präzisierungen und Tricks
-
Ich tue all dies als normale Benutzer (nicht root )
-
Schnappen Sie Infos von
dmesg
dmesg
Verwendung ist eines der ersten Dinge für Ihre Anfrage aktuellen Stand des Systems zu tun:dmesg | sed '/eth.*Link is/h;${x;p};d'
könnte so etwas wie beantworten:
[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 Zustand, könnte Nachricht je nach Hardware variieren und verwendete Treiber.
Nota. Diese
dmesg|grep eth.*Link.is|tail -n1
geschrieben von könnte, aber ich liebersed
mitdmesg | 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
-
Test um
/sys
Pseudo-DateisystemBeim Lesen oder unter writting
/sys
could Ihr System brechen, vor allem, wenn lief als root ! Sie sind gewarnt worden; -)Dies ist ein Pooling-Methode, nicht eine echte Event-Tracking .
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 machen (wenn man einmal unplugged und verstopften zurück, abhängig):
+++ - 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
(Hit Enter Schleife verlassen)
Anmerkung: Diese erfordern
patch
installiert werden .
-
In Ordnung, es schon etwas über diese sein muss ...
Abhängig von Linux Installation , könnten Sie
if-up
undif-down
Skripte zu können, fügen Sie auf diese Art von Ereignissen reagieren.Auf Debian basiert (wie Ubuntu ), können Sie Ihre Skripte in
speichern könnte/etc/network/if-down.d /etc/network/if-post-down.d /etc/network/if-pre-up.d /etc/network/if-up.d
siehe
man interfaces
für mehr Infos.
tail -f /var/log/syslog | grep -E 'link (up|down)'
oder für mich schneller wird:
tail -f /var/log/syslog | grep 'link \(up\|down\)'
Es wird auf die Syslog-Datei hören.
Ergebnis (falls trennen und nach 4 Sekunden wieder anschließen):
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
auf Arch Linux. (Im nicht sicher, auf anderen Distributionen) können Sie die operstate anzeigen können. was zeigt, wenn angeschlossen oder nach unten, wenn nicht die operstate lebt
/sys/class/net/(interface name here)/operstate
#you can also put watch
watch -d -n -1 /sys/class/net/(interface name here)/operstate
Sie können Verwendung ifconfig.
# ifconfig eth0 up
# ifconfig eth0
Wenn der Eintrag RUNNING zeigt, ist die Schnittstelle physikalisch verbunden. Dies wird, wenn die Schnittstelle angezeigt, unabhängig konfiguriert ist.
Dies ist nur ein weiterer Weg, um die Informationen in /sys/class/net/eth0/operstate
zu erhalten.
Ich habe meine OpenWRT verbesserte Gerät als Repeater verwendet und gefunden (die virtuelle Ethernet und Wireless LAN-Funktionen hinzufügt), dass der / sys / class / net / eth0 Träger und opState Werte waren unzuverlässig. Ich spielte mit /sys/class/net/eth0.1 und /sys/class/net/eth0.2 als auch mit (zumindest meiner Erkenntnis) keine zuverlässige Möglichkeit, dass etwas zu erkennen war und sprechen auf jeder physisch angeschlossen der Ethernet-Ports. Ich dachte, ein wenig roh, aber scheinbar zuverlässige Art und Weise zu erkennen, ob etwas zumindest seit dem letzten Neustart / Power-on-Zustand eingesteckt hatte (was arbeitete genau wie ich es brauchte, um in meinem Fall).
ifconfig eth0 | grep -o 'RX packets:[0-9]*' | grep -o '[0-9]*'
Sie erhalten eine 0, wenn nichts und etwas angeschlossen ist> 0, wenn nichts angeschlossen ist seit dem letzten Einschalten oder Neustart-Zyklus (auch wenn es in und seit entfernt angeschlossen wurde).
Hope, das hilft jemand zumindest aus!