Как определить физическое состояние подключения сетевого кабеля / разъема?


в среде Linux мне нужно определить физическое подключенное или отключенное состояние разъема RJ45 к его разъему. Предпочтительно использовать только сценарии BASH.

следующие решения, которые были предложены на других сайтах не работают для этой цели:

  1. использование 'ifconfig' - поскольку сетевой кабель может быть подключен, но сеть не настроена должным образом или не работает в настоящее время.
  2. Ping хост-так как продукт будет находиться в локальной сети использование неизвестной конфигурации сети и неизвестных хостов.

есть ли какое-то состояние, которое можно использовать в файловой системе /proc (все остальное там)?

Как мир Linux должен иметь свою собственную версию пузырька Windows, который появляется из лотка значков, указывая, что вы только что отключили сетевой кабель?


Кентом Фредриком и Лотар, оба ваших ответа удовлетворяют мою потребность... спасибо очень много! Который я буду использовать... Я все еще не знаю.

Я думаю, я не могу поставить вас вниз как правильный ответ? И это, вероятно, справедливо для вас, что я выбираю один. Подбросить монетку, я думаю? Еще раз спасибо!

10 121

10 ответов:

вы хотите посмотреть на узлах

/sys/class/net/

я экспериментировал с моим:

провод подключен:

eth0/carrier:1
eth0/operstate:unknown

Провод Удалено:

eth0/carrier:0
eth0/operstate:down

провод снова подключен:

eth0/operstate:up
eth0/carrier:1

боковой трюк: сбор всех свойств сразу простой способ:

grep "" eth0/* 

это формирует хороший список key:value пар.

можно использовать 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

используйте "IP-монитор", чтобы получить изменения состояния канала в реальном времени.

cat /sys/class/net/ethX это, безусловно, самый простой метод.

интерфейс должен быть вверх, хотя, иначе вы получите ошибку недопустимого аргумента.

Итак, первое:

ifconfig ethX up

затем:

cat /sys/class/net/ethX

на низком уровне, эти события могут быть пойманы с помощью rtnetlink розетки, без каких-либо опросов. Примечание: Если вы используете rtnetlink, вы должны работать вместе с udev, или ваша программа может запутаться, когда udev переименует новый сетевой интерфейс.

проблема с выполнением сетевых конфигураций с помощью сценариев оболочки заключается в том, что сценарии оболочки ужасны для обработки событий (например, сетевой кабель подключается и отключается). Если вам нужно что-то более мощный, взгляните на мой язык программирования NCD язык программирования, предназначенный для сетевых конфигураций.

например, простой скрипт NCD, который будет печатать "cable in" и "cable out" в stdout (при условии, что интерфейс уже запущен):

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() использует rtnetlink, и net.backend.waitdevice() использует udev)

идея 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-адрес будет автоматически удален.

существует два демона, которые обнаруживают эти события:

ifplugd и netplugd

большинство современных дистрибутивов Linux использовать NetworkManager для этого. Вы можете использовать D-BUS для прослушивания событий.

Если вы хотите, чтобы инструмент командной строки для проверки состояния, вы также можете использовать mii-tool, учитывая, что у вас есть Ethernet в виду.

некоторые уточнения и хитрости

  1. я делаю все это как нормальный (не root)

  2. захватите информацию от dmesg

    используя 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
    

    в зависимости от состояния, может варьироваться в зависимости от используемого оборудования и драйверов.

    Nota: это может быть написано 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
    

Я использую эту команду, чтобы проверить, подключен ли провод:

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

Если результат будет вверх или вниз. Иногда он показывает неизвестное, тогда вам нужно проверить

eth0/carrier

Он показывает 0 или 1

на arch linux. (я не уверен, что на других дистрибутивах) вы можете просмотреть состояние operstate. который показывает вверх, если подключен или вниз, если не operstate живет на

/sys/class/net/(interface name here)/operstate
#you can also put watch 
watch -d -n -1 /sys/class/net/(interface name here)/operstate