Как определить физическое состояние сетевого кабеля/разъема?
В среде Linux мне нужно определить физическое подключенное или отсоединенное состояние разъема RJ45 к его гнезду. Предпочтительно использовать только BASH.
Следующие решения, которые были предложены на других сайтах, НЕ работают для этой цели:
- Использование "ifconfig" - поскольку сетевой кабель может быть подключен, но сеть не настроена должным образом или нет.
- Ping хост - поскольку продукт будет находиться в локальной сети, используя неизвестную конфигурацию сети и неизвестные узлы.
Нет ли какого-либо состояния, которое может использоваться в файловой системе /proc (все остальное там)?
Как предполагается, что в мире Linux есть собственная версия пузыря Windows, который появляется из лотка значка, указывающего, что вы только что отключили сетевой кабель?
Кент Фредрик и lothar, оба ваших ответа удовлетворяют мою потребность... большое спасибо! Какой я буду использовать... Я все еще не знаю.
Думаю, я не могу поставить вас обоих как правильный ответ? И это, вероятно, справедливо для вас, что я выбираю его. Поверните монетку, я думаю? Еще раз спасибо!
Ответы
Ответ 1
Вы хотите посмотреть на узлы в
/sys/class/net/
Я экспериментировал с моим:
Провод подключен:
eth0/carrier:1
eth0/operstate:unknown
Провод удален:
eth0/carrier:0
eth0/operstate:down
Снова подключен провод:
eth0/carrier:1
eth0/operstate:up
Side Trick: легко собрать все свойства сразу:
grep "" eth0/*
Это формирует хороший список пар key:value
.
Ответ 2
Вы можете использовать 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
Чтобы получить статус Link, вы можете использовать grep:
$ sudo ethtool eth0 | grep Link
Link detected: yes
Ответ 3
Используйте "ip monitor", чтобы получить изменения состояния ссылки REAL TIME.
Ответ 4
cat /sys/class/net/ethX
- самый простой способ.
Интерфейс должен быть вверх, хотя, иначе вы получите недопустимую ошибку аргумента.
Итак, сначала:
ifconfig ethX up
Тогда:
cat /sys/class/net/ethX
Ответ 5
На низком уровне эти события могут быть обнаружены с помощью rtnetlink сокетов без каких-либо опросов. Замечание: если вы используете rtnetlink, вам нужно работать вместе с udev, или ваша программа может запутаться, когда udev переименовывает новый сетевой интерфейс.
Проблема с выполнением сетевых конфигураций со сценариями оболочки заключается в том, что сценарии оболочки ужасны для обработки событий (например, подключенный и отключенный сетевой кабель). Если вам нужно что-то более мощное, взгляните на мой язык программирования NCD, язык программирования, предназначенный для сетевых конфигураций.
Например, простой NCD script, который будет печатать "кабель в" и "вывести кабель" в стандартный вывод (если интерфейс уже вставлен):
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 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-адрес будет автоматически удален.
Ответ 6
Существует два демона, которые обнаруживают эти события:
ifplugd и netplugd
Ответ 7
В большинстве современных дистрибутивов Linux для этого используется NetworkManager. Вы можете использовать D-BUS для прослушивания событий.
Если вам нужен инструмент командной строки для проверки состояния, вы также можете использовать mii-tool
, учитывая, что у вас есть Ethernet.
Ответ 8
Я использую эту команду для проверки проводки:
cd /sys/class/net/
grep "" eth0/operstate
Если результат будет вверх или вниз. Иногда он показывает неизвестно, тогда вам нужно проверить
eth0/carrier
Он показывает 0 или 1
Ответ 9
Некоторые исправления и трюки
-
Я делаю все это как обычный пользователь (не 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
-
Проверка вокруг /sys
псевдо файловой системы
Чтение или написание под /sys
может привести к повреждению вашей системы, особенно если вы запустите ее как root! Вы были предупреждены: -)
Это метод объединения, а не отслеживание реального события.
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
(Хит Enter для выхода из цикла)
Nota: для этого требуется patch
.
-
В порядке, должно быть что-то об этом...
В зависимости от установки Linux вы можете добавить скрипты if-up
и if-down
, чтобы реагировать на подобные события.
В Debian (например, 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
в arch linux. (im не уверен в других дистрибутивах) вы можете просмотреть операционную систему. который отображается, если подключен или выключен, если не работает рабочее состояние
/sys/class/net/(interface name here)/operstate
#you can also put watch
watch -d -n -1 /sys/class/net/(interface name here)/operstate
Ответ 11
Вы можете использовать ifconfig.
# ifconfig eth0 up
# ifconfig eth0
Если в записи отображается RUNNING, интерфейс физически подключен. Это будет показано независимо от того, настроен ли интерфейс.
Это просто еще один способ получить информацию в /sys/class/net/eth0/operstate
.
Ответ 12
Я использовал свое усовершенствованное устройство OpenWRT в качестве повторителя (который добавляет возможности виртуальной сети Ethernet и беспроводной локальной сети) и обнаружил, что значения несущей /opstate/sys/class/net/eth0 были ненадежными. Я поигрался с /sys/class/net/eth0.1 и /sys/class/net/eth0.2, а также (по крайней мере, на мой взгляд) не нашел надежного способа обнаружить, что что-то физически подключено и разговаривать на любом из портов Ethernet. Я нашел немного грубый, но, казалось бы, надежный способ определить, было ли что-либо подключено с момента последней перезагрузки/включения питания, по крайней мере (что работало именно так, как мне было нужно в моем случае).
ifconfig eth0 | grep -o 'RX packets:[0-9]*' | grep -o '[0-9]*'
Вы получите 0, если ничего не подключено, и что-то> 0, если что-либо было подключено (даже если оно было подключено и с тех пор удалено) с момента последнего включения или перезагрузки.
Надеюсь, это поможет кому-нибудь хотя бы!
Ответ 13
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