В среде Linux мне нужно определить физическое состояние подключения или отключения разъема RJ45 к его разъему. Предпочтительно использовать только сценарии BASH.
Следующие решения, которые были предложены на других сайтах, НЕ работают для этой цели:
- Использование 'ifconfig' - поскольку сетевой кабель может быть подключен, но сеть не настроена должным образом или в данный момент не подключена.
- Ping host - поскольку продукт будет находиться в локальной сети с использованием неизвестной конфигурации сети и неизвестных хостов.
Нет ли какого-либо состояния, которое можно использовать в файловой системе / proc (все остальное там)?
Как мир Linux может иметь собственную версию пузыря Windows, которая появляется из трея значков, показывая, что вы только что отключили сетевой кабель?
Кент Фредрик и Лотар , оба ваших ответа удовлетворяют мою потребность ... большое спасибо! Какой я буду использовать ... Я до сих пор не знаю.
Думаю, я не могу поставить вас обоих за правильный ответ? И это, вероятно, справедливо для вас, что я выберу один. Я полагаю, бросить монетку? Еще раз спасибо!
grep -H . eth0/*
это отбрасывать пустые строки и печатать название записи с каждой строки.grep -s "" eth0/*
Вы можете использовать ethtool :
Чтобы получить только статус ссылки, вы можете использовать grep:
источник
grep Link
Является ли. Спасибо!!up
заявить.Используйте «IP-монитор», чтобы получить изменения состояния связи в реальном времени.
источник
1
когда мой кабель отключен, хотя наip monitor
самом деле что-то показываетcat /sys/class/net/ethX
безусловно, самый простой метод.Интерфейс должен быть включен, иначе вы получите ошибку неверного аргумента.
Итак, сначала:
Затем:
источник
ethX/carrier
который равен 1, если обнаружен «носитель», что означает, что кабель подключен и передает данные ...На низком уровне эти события могут быть перехвачены с помощью rtnetlink сокетов без какого-либо опроса. Примечание: если вы используете rtnetlink, вам придется работать вместе с udev, иначе ваша программа может запутаться, когда udev переименует новый сетевой интерфейс.
Проблема с настройкой сети с помощью сценариев оболочки заключается в том, что сценарии оболочки ужасны при обработке событий (например, при подключении и отключении сетевого кабеля). Если вам нужно что-то более мощное, взгляните на мой язык программирования NCD программирования, разработанный для сетевых конфигураций.
Например, простой сценарий NCD, который выводит «кабель на вход» и «кабель на выход» на стандартный вывод (при условии, что интерфейс уже подключен):
(внутренне
net.backend.waitlink()
использует rtnetlink иnet.backend.waitdevice()
использует udev)Идея NCD заключается в том, что вы используете его исключительно для настройки сети, поэтому, как правило, между ними могут находиться команды конфигурации, такие как:
Важная часть, на которую следует обратить внимание, заключается в том, что исполнение может регрессировать ; во втором примере, например, если кабель вытащен, IP-адрес будет автоматически удален.
источник
Существует два демона, которые обнаруживают эти события:
ifplugd и netplugd
источник
ifplugstatus
инструмент отifplugd
демона. Нет необходимости в аргументах, просто введите,ifplugstatus
и вы получите все NIC как подключенные или отключенные.Большинство современных дистрибутивов Linux используют NetworkManager для этого . Вы можете использовать D-BUS для прослушивания событий.
Если вы хотите, чтобы инструмент командной строки проверял состояние, вы также можете использовать его
mii-tool
, учитывая, что вы имеете в виду Ethernet.источник
mii-tool
кажется, единственная команда, которая может сообщать о состоянии связи, когда интерфейс не работает.Я использую эту команду для проверки подключения:
Если результат будет вверх или вниз. Иногда показывает неизвестное, тогда нужно проверить
Показывает 0 или 1
источник
Некоторые точности и хитрости
Я делаю все это как обычный пользователь (не root )
Получить информацию от
dmesg
Использование
dmesg
- это одна из первых вещей, которую нужно выполнить для запроса текущего состояния системы:может ответить что-то вроде:
или
в зависимости от состояния сообщение может отличаться в зависимости от используемого оборудования и драйверов.
Примечание: это может быть написано,
dmesg|grep eth.*Link.is|tail -n1
но я предпочитаю использоватьsed
.Тест вокруг
/sys
псевдофайловой системыЧтение или запись в систему
/sys
может привести к поломке вашей системы, особенно если вы запускаетесь от имени пользователя root ! Вы были предупреждены ;-)Это метод объединения, а не отслеживание реальных событий .
Может сделать что-то вроде (после того, как вы отключили и снова подключили, в зависимости от):
(Нажмите, Enterчтобы выйти из цикла)
Примечание: это необходимо
patch
установить.В порядке, должно быть уже что-то об этом ...
В зависимости от установки Linux , вы можете добавить
if-up
иif-down
сценарии, чтобы иметь возможность реагировать на такого рода события.На основе Debian (например, Ubuntu ) вы можете хранить свои скрипты в
см.
man interfaces
больше информации.источник
e1000
а вечер может произойти в другое время936555.596870
, но вы все равно увидитеNIC Link is
.Вы можете использовать ifconfig.
Если в записи отображается RUNNING, интерфейс физически подключен. Это будет показано независимо от того, настроен ли интерфейс.
Это просто еще один способ получить информацию
/sys/class/net/eth0/operstate
.источник
на арке линукс. (Я не уверен, что на других дистрибутивах) вы можете посмотреть на operstate. который появляется, если подключен или вниз, если не находится в штате
источник
или для меня быстрее получается:
Он будет слушать файл системного журнала.
Результат (если отключиться и через 4 секунды снова подключиться):
источник
Так или иначе, если вы хотите проверить, подключен ли Ethernet-кабель к Linux после коммэнда: «ifconfig eth0 down». Я нахожу решение: используйте инструмент ethtool.
если кабель подключен, проверка соединения равна 0, в противном случае - 1.
источник
Я использовал свое усовершенствованное устройство OpenWRT в качестве повторителя (который добавляет возможности виртуальной сети Ethernet и беспроводной локальной сети) и обнаружил, что значения несущей / opstate / sys / class / net / eth0 были ненадежными. Я поиграл с /sys/class/net/eth0.1 и /sys/class/net/eth0.2, а также (по крайней мере, на мой взгляд) не нашел надежного способа обнаружить, что что-то физически подключено и разговаривать из портов Ethernet. Я нашел немного грубый, но, казалось бы, надежный способ определить, было ли подключено что-либо, по крайней мере, с момента последней перезагрузки / включения питания (что работало именно так, как мне было нужно в моем случае).
Вы получите 0, если ничего не было подключено, и что-то> 0, если что-то было подключено (даже если оно было подключено и с тех пор удалено) с момента последнего включения или перезагрузки.
Надеюсь, это поможет кому-нибудь хотя бы!
источник