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:
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!
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.
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
Verwenden Sie 'ip monitor', um die Änderungen des REAL TIME-Verbindungsstatus anzuzeigen.
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
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.
Es gibt zwei Dämonen, die diese Ereignisse erkennen:
ifplugd und netplugd
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
Ich mache das alles als normaler Benutzer (nicht root )
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
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.
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
.
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.
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
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.
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
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!