Рейтинг:1

Как заставить скрипт if-up работать только при подключенном кабеле?

флаг cn

Я использую Ubuntu 18.04 на нашем встроенном устройстве. Я последовал за https://netplan.io/faq создав "/etc/networkd-dispatcher/routable.d/50-ifup-hooks":

#!/бин/ш

эхо "Интерфейс вверх"
# Сделай что-нибудь

выход 0

При подключении сетевого кабеля к роутеру вызывается скрипт. Проблема в том, что этот скрипт вызывался каждые 5 секунд после подключения кабеля.Я бы хотел просто «Сделать что-нибудь», когда сетевой кабель подключен к маршрутизатору, но не запускать «Сделать что-нибудь» каждые 5 секунд после того, как кабель уже подключен. Есть ли способ убедиться, что сценарий вызывается только после подключения сетевого кабеля к маршрутизатору, но не выполняется, когда кабель уже подключен к маршрутизатору?

Спасибо!

Редактировать: Вот команда ll в папке /etc/networkd-dispatcher:

root@machine:/etc/networkd-dispatcher# ll
всего 28
drwxr-xr-x 7 root root 4096 20 сентября 16:04 ./
drwxr-xr-x 77 root root 4096 16 сентября 18:03 ../
drwxr-xr-x 2 root root 4096 20 сентября 16:05 перевозчик.d/
drwxr-xr-x 2 root root 4096 15 октября 2018 г. dormant.d/
drwxr-xr-x 2 root root 4096 15 октября 2018 г. no-carrier.d/
drwxr-xr-x 2 root root 4096 20 сентября 07:12 офф.д/
drwxr-xr-x 2 root root 4096 20 сентября 16:04 routable.d/

Вот команда ll для папкиcarrier.d:

root@machine:/etc/networkd-dispatcher# ll носитель.d/
всего 12
drwxr-xr-x 2 root root 4096 20 сентября 16:05 ./
drwxr-xr-x 7 root root 4096 20 сентября 16:04 ../
-rwxr-xr-x 1 root root 209 20 сентября 16:05 50-ifup-hooks*
Kev Inski avatar
флаг us
Согласно `man networkctl` скрипты под `routable.d` выполняются, когда 'ссылка имеет настроенный перевозчик и маршрутизируемый адрес'. Я предполагаю, что при каждом обновлении аренды скрипт выполняется. Попробуйте поместить скрипт в папку `carrier.d` - он должен выполняться только при наличии носителя. Но это зависит от варианта использования, которого вы пытаетесь достичь. Например: «сделать что-нибудь, когда кабель подключен» или «сделать что-нибудь, когда ссылка получает (возможно, новый) адрес»
флаг cn
Спасибо @Кев Ински. Это «Сделать что-нибудь» означает «Выпустить/обновить DHCP». Что мы хотели сделать, так это выполнить выпуск/обновление DHCP после подключения сетевого кабеля. Это объясняет, почему скрипт продолжает вызываться. Следуя вашему предложению, я создал папку /etc/networkd-dispatcher/carrier.d (поскольку ее не существовало по умолчанию. Не уверен, что это правильно, создав папку вручную). Затем я переместил скрипт в папку "carrier.d". Я перезапустил службу. Но ничего не происходит, когда кабель подключен. Я делаю это правильно? Есть ли лучший способ достичь моей цели?
Kev Inski avatar
флаг us
Я настраиваю виртуальную машину 18.04 и пытаюсь проверить это. Немного странно, что папки не существует, но я поищу. Является ли вновь созданная папка `carrier.d` владельцем root с правами доступа 0755? Является ли сценарий исполняемым и принадлежит пользователю root. Вы можете отредактировать свой вопрос. `ll /etc/networkd-dispatcher/` или, может быть, `tree /etc/networkd-dispatcher/` также было бы неплохо увидеть. Это сервер 18.04 (поскольку это встроенное устройство) или «обычная» настольная версия?
Kev Inski avatar
флаг us
Кажется, я понял, почему это не работает ни для вас, ни для Ubuntu 18.04. Проблема заключается в версии `systemd`, которая предоставляет сетевые возможности. Ubuntu 18.04 использует systemd версии 237, тогда как Ubuntu 20.04 использует версию 245. Поэтому предоставленное мной решение не будет работать, поскольку вы не можете обнаружить изменение состояния с помощью netplan. Единственное решение, которое я вижу, это либо обновиться до Ubuntu 20.04 (что может быть невозможно), либо использовать «старый» «ifupdown» для замены netplan.(ручная установка/компиляция systemd также возможна, но не рекомендуется.)
флаг cn
Спасибо @Кев Ински. Обновление до Ubuntu 20.04 пока не вариант. Переход на «старый» ifupdown тоже не вариант. Я думаю, что одно из решений - проверить состояние сетевых интерфейсов. Основываясь на https://linuxconfig.org/how-to-detect-whether-a-physical-cable-is-connected-to-network-card-slot-on-linux, я мог бы использовать «for i in $( ls /sys/class/net ); do echo -n $i: ; cat /sys/class/net/$i/carrier; done" для периодической проверки состояния сетевого интерфейса. Если статус любого сетевого интерфейса изменится с 0 на 1, я запущу выпуск/обновление DHCP. Как вы думаете, это сработает? Спасибо.
флаг cn
@Kev Inski Есть ли способ, которым мы можем определить разницу между штекером кабеля и обновлением адреса DHCP в сценарииCARr.d/50-ifup-hooks? Если есть способ, то я могу просто выполнить выпуск/обновление DHCP для штекера кабеля, но не для обновления адреса. Спасибо.
Рейтинг:0
флаг us

Может быть, этот небольшой скрипт может помочь вам. Это даже может быть вызвано по назначению netplan (systemd) из маршрутизируемый.d папка, если вы раскомментируете #NETDEV=${IFACE}. Конечно, он не окончательный и требует некоторой доработки, но вы можете использовать его как основу.

#!/бин/баш

NETDEV=enp0s3
#NETDEV=${IFACE}
TMP_FILE=/tmp/link_state-${NETDEV}
СТАРОЕ_СОСТОЯНИЕ=
HAS_CARRIER="ПЕРЕВОЗЧИК"
HAS_NO_CARRIER="NO_CARRIER"

если [ -e "${TMP_FILE}" ]; тогда
    OLD_STATE=$(кот "${TMP_FILE}")
фи
    
эхо "старое_состояние: ${OLD_STATE}"

РЕЗУЛЬТАТ = $ (ссылка ip show dev "$ {NETDEV}" | grep '<NO_CARRIER')
ПОВТОР=$?

если [ ${RETVAL} -eq 1 ]; тогда
    эхо "имеет носитель"
    если [ "${OLD_STATE}" = "${HAS_CARRIER}" ]; тогда
        эхо "без изменения состояния"
    еще
        echo -n "${HAS_CARRIER}" > "${TMP_FILE}"
    фи
еще
    echo "Состояние ${NETDEV} в настоящее время ${HAS_NO_CARRIER}"
    если [ "${OLD_STATE}" = "${HAS_NO_CARRIER}" ]; тогда
        эхо "без изменения состояния"
    еще
        echo -n "${HAS_NO_CARRIER}" > "${TMP_FILE}"
    фи
фи
флаг cn
Спасибо @Kev Inski. Я раскомментировал строку «#NETDEV=${IFACE}». При подключении кабеля ничего не происходит. Затем я изменил строку, чтобы использовать наш интерфейс "NETDEV=pan0". Когда я подключаю кабель, запускается первое «если», а затем запускается встроенное «если». Однако после того, как я добавил туда «/sbin/dhclient -r /sbin/dhclient», эта часть кода снова зациклилась. Это означает, что когда я подключаю кабель, выпуск/обновление DHCP запускается каждые 5 секунд.Итак, вопрос в том, есть ли способ определить разницу между событием подключения кабеля и обновлением адреса DHCP?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.