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:

  1. Verwenden von ‚ifconfig‘ -., Da ein Netzwerkkabel angeschlossen werden können, aber das Netzwerk nicht richtig konfiguriert oder nicht aktuell bis
  2. 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!

War es hilfreich?

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

  1. Ich tue all dies als normale Benutzer (nicht root )

  2. 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 lieber sed mit

    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. Test um /sys Pseudo-Dateisystem

    Beim Lesen oder unter writting /syscould 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

  4. .
  5. In Ordnung, es schon etwas über diese sein muss ...

    Abhängig von Linux Installation , könnten Sie if-up und if-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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top