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:
- Verwenden von 'ifconfig' - da möglicherweise ein Netzwerkkabel angeschlossen ist, das Netzwerk jedoch nicht ordnungsgemäß konfiguriert ist oder derzeit nicht aktiv ist.
- 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!
quelle
grep -H . eth0/*
:: Diese Peitsche leere Zeilen und drucken Eintragsnamen mit gehören zu jeder Zeile.grep -s "" eth0/*
Sie können ethtool verwenden :
Um nur den Linkstatus zu erhalten, können Sie grep verwenden:
quelle
grep Link
macht es. Danke dir!!up
Status gezwungen werden .Verwenden Sie 'ip monitor', um Änderungen des Verbindungsstatus von REAL TIME zu erhalten.
quelle
1
wenn mein Kabel während getrennt istip monitor
tatsächlich zeigt etwascat /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:
Dann:
quelle
ethX/carrier
1 überprüfen, wenn der "Träger" erkannt wird, was bedeutet, dass ein Kabel angeschlossen ist und Daten überträgt ...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):
(intern
net.backend.waitlink()
verwendet rtnetlink undnet.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.
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.
quelle
Es gibt zwei Dämonen, die diese Ereignisse erkennen:
ifplugd und netplugd
quelle
ifplugstatus
Tool vomifplugd
Daemon. Sie brauchen keine Argumente, geben Sie einfach einifplugstatus
und Sie erhalten die gesamte Netzwerkkarte als angeschlossen oder nicht angeschlossen.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.quelle
mii-tool
scheint der einzige Befehl zu sein, der über den Verbindungsstatus berichten kann, wenn die Schnittstelle nicht verfügbar ist.Ich benutze diesen Befehl, um zu überprüfen, ob ein Draht angeschlossen ist:
Wenn das Ergebnis nach oben oder unten geht. Manchmal zeigt es unbekannt, dann müssen Sie überprüfen
Es zeigt 0 oder 1
quelle
Einige Präzisionen und Tricks
Ich mache das alles als normaler Benutzer (nicht root )
Besorgen Sie sich Infos von
dmesg
Die Verwendung
dmesg
ist eines der ersten Dinge, die Sie tun müssen, um den aktuellen Status des Systems abzufragen :könnte so etwas beantworten wie:
oder
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 -n1
aber ich bevorzuge die Verwendungsed
.Testen Sie herum
/sys
Pseudo-DateisystemDas Lesen oder Schreiben unter
/sys
kann 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 .
Könnte so etwas wie rendern (je nachdem, ob Sie den Stecker gezogen und wieder eingesteckt haben, je nachdem):
(Schlagen Enter Zum Verlassen der Schleife drücken)
Nota: Dies erfordert
patch
muss installiert sein.In Ordnung, da muss schon was dran sein ...
Abhängig von der Linux-Installation können Sie
if-up
und 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
siehe
man interfaces
für mehr Infos.quelle
e1000
und die Abstimmung zu einem anderen Zeitpunkt als erfolgen kann936555.596870
, aber Sie werden es immer sehenNIC Link is
.Sie können ifconfig verwenden.
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
.quelle
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
quelle
oder für mich wird schneller:
Es wird die Syslog-Datei abhören.
Ergebnis (wenn die Verbindung trennen und nach 4 Sekunden erneut verbinden):
quelle
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.
Wenn ein Kabel angeschlossen ist, ist der Verbindungstest 0, andernfalls 1.
quelle
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).
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!
quelle