代码之家  ›  专栏  ›  技术社区  ›  Jeach

如何检测网络电缆/连接器的物理连接状态?

  •  127
  • Jeach  · 技术社区  · 17 年前

    在其他现场提出的以下解决方案不适用于此目的:

    1. 使用“ifconfig”-因为网络电缆可能已连接,但网络未正确配置或当前未启动。
    2. Ping主机-因为产品将位于使用未知网络配置和未知主机的LAN内。

    是否存在可以在/proc文件系统中使用的某些状态(其他所有内容都在其中)?

    Linux世界怎么会有自己版本的Windows bubble,从图标托盘中弹出,表明您刚刚拔下了网线?


    洛塔尔 ,你的两个答案都满足了我的需要。。。谢谢!我会用哪一个。。。我还是不知道。

    我想我不能说你们两个都是正确答案?我选择一个对你来说可能是公平的。我猜是掷硬币吧?再次感谢!

    13 回复  |  直到 17 年前
        1
  •  236
  •   Ricky Robinson    7 年前

    您希望查看中的节点

    /sys/class/net/
    

    我尝试了我的:

    插入的导线:

    eth0/carrier:1
    eth0/operstate:unknown
    

    eth0/carrier:0
    eth0/operstate:down
    

    再次插入电线:

    eth0/carrier:1
    eth0/operstate:up
    

    附带技巧:一次获取所有属性的简单方法:

    grep "" eth0/* 
    

    这是一个很好的列表 key:value 对。

        2
  •  89
  •   lothar    17 年前

    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
    

    要仅获取链接状态,您可以使用grep:

    $ sudo ethtool eth0 | grep Link
        Link detected: yes
    
        3
  •  27
  •   Peter Quiring    13 年前

    使用“ip监视器”获取实时链路状态更改。

        4
  •  18
  •   Eugene Yarmash    14 年前

    cat /sys/class/net/ethX 这是迄今为止最简单的方法。

    接口必须启动,否则将出现无效参数错误。

    因此,首先:

    ifconfig ethX up
    

    然后:

    cat /sys/class/net/ethX
    
        5
  •  9
  •   Ambroz Bizjak    14 年前

    rtnetlink 套接字,无需任何轮询。旁注:如果您使用rtnetlink,您必须与udev一起工作,否则当udev重命名新的网络接口时,您的程序可能会混淆。

    使用shell脚本进行网络配置的问题是 shell脚本对于事件处理非常糟糕 (例如插入和拔出的网络电缆)。如果你需要更强大的东西,看看我的 NCD programming language ,一种为网络配置而设计的编程语言。

    例如,一个简单的NCD脚本将“电缆输入”和“电缆输出”打印到标准输出(假设接口已经启动):

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

    (内部, net.backend.waitlink() net.backend.waitdevice()

    NCD的理念是,您专门使用它来配置网络,因此通常情况下,配置命令会介于两者之间,例如:

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

    需要注意的重要部分是,允许执行 倒退 ; 例如,在第二个示例中,如果拔出电缆,IP地址将自动删除。

        6
  •  5
  •   German    12 年前

    存在两个检测这些事件的守护进程:

    插件 网络插件

        7
  •  3
  •   andri    17 年前

    大多数现代Linux发行版都使用 NetworkManager

    如果需要命令行工具检查状态,也可以使用 mii-tool ,考虑到您考虑的是以太网。

        8
  •  3
  •   Sarvar Nishonboyev    11 年前

    我使用此命令检查导线是否已连接:

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

    eth0/carrier
    

    它显示0或1

        9
  •  3
  •   F. Hauri - Give Up GitHub    9 年前

    一些精确性和技巧

    1. 我做这一切都是因为 )

    2. 从中获取信息 dmesg

      使用 启动信息 是询问的第一件事 现状 系统名称:

      dmesg | sed '/eth.*Link is/h;${x;p};d'
      

      可以回答如下问题:

      [936536.904154] e1000e: eth0 NIC Link is Down
      

      [936555.596870] e1000e: eth0 NIC Link is Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
      

      根据状态的不同,消息可能因所使用的硬件和驱动程序而异。

      注:可以用书面形式 dmesg|grep eth.*Link.is|tail -n1 但我更喜欢使用 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
      
    3. 试验 /sys 伪文件系统

      /系统 可能会破坏你的系统,尤其是当你以 ! 您已被警告;-)

      这是一种池方法,不是真正的池方法 事件跟踪 .

      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
      

      +++ -   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
      

      (击中

      注:这要求 patch

    4. 好吧,这肯定已经有点道理了。。。

      取决于 Linux安装 ,你可以加上 if-up if-down 脚本,以便能够对此类事件作出反应。

      在…上 德比安 基于(如 Ubuntu ),您可以将脚本存储到

      /etc/network/if-down.d
      /etc/network/if-post-down.d
      /etc/network/if-pre-up.d
      /etc/network/if-up.d
      

      看见 man interfaces 更多信息。

        10
  •  1
  •   Skrmnghrd    8 年前

    /sys/class/net/(interface name here)/operstate
    #you can also put watch 
    watch -d -n -1 /sys/class/net/(interface name here)/operstate
    
        11
  •  1
  •   craig65535    7 年前

    可以 使用ifconfig。

    # ifconfig eth0 up
    # ifconfig eth0
    

    这只是获取信息的另一种方式 /sys/class/net/eth0/operstate

        12
  •  1
  •   Dima    7 年前
    tail -f /var/log/syslog | grep -E 'link (up|down)'
    

    或者对我来说更快得到:

    tail -f /var/log/syslog | grep 'link \(up\|down\)'
    

    结果(如果断开并在4秒钟后再次连接):

    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
    
        13
  •  1
  •   kyzrong    6 年前

    不知何故,如果您想检查以太网电缆是否在linux中插入后提示:“ifconfig eth0 down”。 我找到了一个解决方案: 使用ethtool工具。

    #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
    

    如果连接了电缆,则链路测试为0,否则为1。

        14
  •  1
  •   Sergio Abreu    4 年前

    astate=`ip a | grep -E -o -m 1 "2:.*state UP"`  
    if [ -n "$astat" ]; then
       echo 'cable is on'
    else
       echo 'cable is off'
    fi
    
        15
  •  0
  •   Jeach    5 年前

    在OpenWRT上,可靠执行此操作的唯一方法(至少对我而言)是运行以下命令:

    # Get switch name
    swconfig list
    
    # assuming switch name is "switch0"
    swconfig dev switch0 show | grep link:
    
    # Possible output
    root@OpenWrt:~# swconfig dev switch0 show | grep link:
            link: port:0 link:up speed:1000baseT full-duplex txflow rxflow
            link: port:1 link:up speed:1000baseT full-duplex txflow rxflow eee100 eee1000 auto
            link: port:2 link:up speed:1000baseT full-duplex txflow rxflow eee100 eee1000 auto
            link: port:3 link:down
            link: port:4 link:up speed:1000baseT full-duplex eee100 eee1000 auto
            link: port:5 link:down
            link: port:6 link:up speed:1000baseT full-duplex txflow rxflow
    

    这将在交换机的每个端口上显示“link:down”或“link:up”。

        16
  •  -1
  •   JxAxMxIxN Coderzelf    7 年前

    我将我的OpenWRT增强型设备用作中继器(增加了虚拟以太网和无线lan功能),发现/sys/class/net/eth0载波和opstate值不可靠。我使用了/sys/class/net/eth0.1和/sys/class/net/eth0.2,并且(至少根据我的发现)没有可靠的方法来检测物理上插入了什么东西并在任何以太网端口上讲话。我想出了一个有点粗糙但似乎可靠的方法来检测自上次重新启动/通电状态以来是否插入了任何东西(这正是我需要的)。

    ifconfig eth0 | grep -o 'RX packets:[0-9]*' | grep -o '[0-9]*'
    

    如果未插入任何东西,则您将得到一个0;如果自上一次通电或重新启动循环以来有任何东西已插入(即使已插入并移除)。

    希望这至少能帮到别人!