How to detect the physical connected state of a network cable/connector?

后端 未结 15 1341
隐瞒了意图╮
隐瞒了意图╮ 2020-12-04 04:23

In a Linux environment, I need to detect the physical connected or disconnected state of an RJ45 connector to its socket. Preferably using BASH scripting only.

The

相关标签:
15条回答
  • 2020-12-04 05:13

    I use this command to check a wire is connected:

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

    If the result will be up or down. Sometimes it shows unknown, then you need to check

    eth0/carrier
    

    It shows 0 or 1

    0 讨论(0)
  • 2020-12-04 05:14

    Somehow if you want to check if the ethernet cable plugged in linux after the commend:" ifconfig eth0 down". I find a solution: use the ethtool tool.

    #ethtool -t eth0
    The test result is PASS
    The test extra info:
    Register test  (offline)         0
    Eeprom test    (offline)         0
    Interrupt test (offline)         0
    Loopback test  (offline)         0
    Link test   (on/offline)         0
    

    if cable is connected,link test is 0,otherwise is 1.

    0 讨论(0)
  • 2020-12-04 05:16

    You can use 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
    

    To only get the Link status you can use grep:

    $ sudo ethtool eth0 | grep Link
        Link detected: yes
    
    0 讨论(0)
  • 2020-12-04 05:16

    On the low level, these events can be caught using rtnetlink sockets, without any polling. Side note: if you use rtnetlink, you have to work together with udev, or your program may get confused when udev renames a new network interface.

    The problem with doing network configurations with shell scripts is that shell scripts are terrible for event handling (such as a network cable being plugged in and out). If you need something more powerful, take a look at my NCD programming language, a programming language designed for network configurations.

    For example, a simple NCD script that will print "cable in" and "cable out" to stdout (assuming the interface is already up):

    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 :)
    }
    

    (internally, net.backend.waitlink() uses rtnetlink, and net.backend.waitdevice() uses udev)

    The idea of NCD is that you use it exclusively to configure the network, so normally, configuration commands would come in between, such as:

    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");
    }
    

    The important part to note is that execution is allowed to regress; in the second example, for instance, if the cable is pulled out, the IP address will automatically be removed.

    0 讨论(0)
  • 2020-12-04 05:17

    You want to look at the nodes in

    /sys/class/net/
    

    I experimented with mine:

    Wire Plugged in:

    eth0/carrier:1
    eth0/operstate:unknown
    

    Wire Removed:

    eth0/carrier:0
    eth0/operstate:down
    

    Wire Plugged in Again:

    eth0/carrier:1
    eth0/operstate:up
    

    Side Trick: harvesting all properties at once the easy way:

    grep "" eth0/* 
    

    This forms a nice list of key:value pairs.

    0 讨论(0)
  • 2020-12-04 05:20

    cat /sys/class/net/ethX is by far the easiest method.

    The interface has to be up though, else you will get an invalid argument error.

    So first:

    ifconfig ethX up
    

    Then:

    cat /sys/class/net/ethX
    
    0 讨论(0)
提交回复
热议问题