Как определить физическое состояние подключения сетевого кабеля / разъема?
в среде Linux мне нужно определить физическое подключенное или отключенное состояние разъема RJ45 к его разъему. Предпочтительно использовать только сценарии BASH.
следующие решения, которые были предложены на других сайтах не работают для этой цели:
- использование 'ifconfig' - поскольку сетевой кабель может быть подключен, но сеть не настроена должным образом или не работает в настоящее время.
- Ping хост-так как продукт будет находиться в локальной сети использование неизвестной конфигурации сети и неизвестных хостов.
есть ли какое-то состояние, которое можно использовать в файловой системе /proc (все остальное там)?
Как мир Linux должен иметь свою собственную версию пузырька Windows, который появляется из лотка значков, указывая, что вы только что отключили сетевой кабель?
Кентом Фредриком и Лотар, оба ваших ответа удовлетворяют мою потребность... спасибо очень много! Который я буду использовать... Я все еще не знаю.
Я думаю, я не могу поставить вас вниз как правильный ответ? И это, вероятно, справедливо для вас, что я выбираю один. Подбросить монетку, я думаю? Еще раз спасибо!
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
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-адрес будет автоматически удален.
большинство современных дистрибутивов Linux использовать NetworkManager для этого. Вы можете использовать D-BUS для прослушивания событий.
Если вы хотите, чтобы инструмент командной строки для проверки состояния, вы также можете использовать
mii-tool
, учитывая, что у вас есть Ethernet в виду.
некоторые уточнения и хитрости
я делаю все это как нормальный (не root)
захватите информацию от
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