Ubuntu: дождитесь подключения к сети и выполните команду bash

#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