#linux #bash #shell #ubuntu #networking
#linux #bash #оболочка #ubuntu #сеть
Вопрос:
В Ubuntu (с последним дистрибутивом все в порядке) я хочу перезагрузить маршрутизатор, и внутри скрипта bash я хотел бы иметь команду, которая ожидает повторного подключения к сети и, когда это обнаружит, должна запустить команду bash.
Я мог бы реализовать это с помощью какого-нибудь цикла опроса, но идеальным решением было бы иметь команду bash, которая при выполнении ожидает подключения к сети и автоматически выполняет команду bash, которую я ей дал.
Я кое-что прочитал о dbus (и dbus, похоже, правильный путь), но также кажется, что требуется слишком много времени, чтобы полностью понять, как его правильно использовать. Мне предложили проверить, может ли такой инструмент, как ethtool, выполнять такого рода «ожидание и выполнение», но на страницах руководства я ничего об этом не нашел.
Примечание: Я забыл сказать, что я хотел бы, чтобы команда проверяла, подключен ли ФИЗИЧЕСКИЙ уровень соединения. Таким образом, решения, работающие на верхних уровнях, не принимаются. Более того, решения, включающие размещение скриптов внутри каталогов (таких как/etc/network/if-up.d), также не принимаются.
Есть идеи?
Спасибо
Ответ №1:
Предложенный мной прослушиватель событий:
inotifywait -e modify /sys/class/net/eth0/carrier; echo 'Change detected'
Когда вы подключаете или отсоединяете сетевой кабель, это вызовет эхо «Обнаружено изменение», конечно, это может вызвать практически что угодно.
И это будет выполняться как одноразовое, но я так понимаю, вы знаете, как сделать из этого демона, если нет, то это будет хорошим упражнением для изучения 🙂
Комментарии:
1. Единственное, что мне нужно проверить (прямо сейчас я не могу), это изменится ли значение в /sys / class / net / eth0 / carrier, даже если кабель подключен, но маршрутизатор был перезагружен
2. Подключен ли хост непосредственно к маршрутизатору?
3. Да, это так. Я внедрил несколько тестов в bash, и один из этих тестов требует, чтобы при перезагрузке маршрутизатора мой скрипт bash выполнял команду.
4. Я пытался использовать inotify, но, похоже, он не определяет, когда изменен /sys / class /net / eth0 / carrier. Я читал, что inotify не может обнаружить изменения во всех файлах в sysfs. Это может быть одним из таких случаев. Просто вопрос: вы пробовали ваше решение на своем компьютере?
5. @condorwasabi, один из файлов, который изменяется (открывается или к которому осуществляется доступ) при подключении, — это
/etc/network/if-up.d/avahi-daemon
file, который вы можете использоватьinotifywait
, затем вы можете проверить/sys/class/net/eth0/carrier
значение файла (0 или 1 ).
Ответ №2:
Если вы хотите, чтобы команда проверяла, подключена ли ссылка вверх или вниз, используйте ip
:
ip addr show eth0 | grep -Po "(?<=state ).*?(?=s)"
DOWN
ip addr show wlan0 | grep -Po "(?<=state ).*?(?=s)"
UP
Ответ №3:
Вы можете проверить наличие соединения с помощью файла /sys / class /net / eth0 / carrier
cat /sys/class/net/eth0/carrier
если вывод равен 1, то кабель Ethernet подключен и соединение установлено.
если вывод равен 0, то кабель ethernet отсоединен и соединение отключено.
Примечание: если у вас есть интерфейс, отличный от eth0, замените интерфейс, подобный eth2 / eth3, на eth0
Комментарии:
1. И ваше решение, и решение @Tiago хороши, но они относятся к «типу опроса». Если бы мы могли найти команду, которая не требует от меня выполнения явного опроса, это было бы идеальным решением
2. @condorwasabi вы могли бы использовать
inotify
в качестве прослушивателя событий на случай, если изменение произойдет на/sys/class/net/eth0/carrier