Я предоставляю сценарий, который прослушивает сигналы dbus, который позволит вам реагировать быстрее, чем если бы вы запрашивали изменения в текущей конфигурации сети. Это помогает в системах, где скрипты / etc / не выполняются, когда вы этого хотите (как в моей системе 14.04).
мои входы / выходы не работают
NetworkManager запускает dhclient с флагом, -sf /usr/lib/NetworkManager/nm-dhcp-client.action
который, кажется, переопределяет нормальное поведение входа / выхода. Поведение по умолчанию с dhclient - вызывать скрипты в /etc/dhcp/dhclient-{enter,exit}-hooks.d
. Это не вызывается вообще в моей системе.
мои скрипты NetworkManager dispatcher.d тоже не работают
NM, однако, вызывает другой набор скриптов /etc/NetworkManager/dispatcher.d
для информирования о различных событиях. Страница man NetworkManager (8) определяет dhcp4-change
и dhcp6-change
действия, которые, кажется, делают именно то, что вы хотите. Несмотря на то, что написано в man-странице, по крайней мере, в моей системе только up
и down
выполняются действия. Я не могу заставить эти сценарии запускать что-либо еще. Так что это не очень хороший способ отслеживать изменения IP.
Итак, отслеживание непосредственно по сигналам dbus, излучаемым NM
nm-dhcp-client.action
( source ) из командной строки просто преобразует все переменные окружения, установленные dhclient, в сигнал dbus. Эти переменные среды определены в man dhclient-script
(8). Один из них представляет особый интерес $new_ip_address
. Как вы можете предположить, @Bernhard, вы могли бы контролировать сигнал и действовать в соответствии с его содержимым.
Вот программа, которая отследит все данные о событиях, сообщенные этим двоичным файлом:
#!/bin/bash -e
#
# This script listens for the org.freedesktop.nm_dhcp_client signal.
# The signal is emitted every time dhclient-script would execute.
# It has the same contents as the environment passed to
# dhclient-script (8). Refer to manpage for variables of interest.
#
# "org.freedesktop.nm_dhcp_client" is an undocumented signal name,
# as far as I could tell. it is emitted by nm-dhcp-client.action,
# which is from the NetworkManager package source code.
#
# detail: todo cleanup subprocess on exit. if the parent exits,
# the subprocess will linger until it tries to print
# at which point it will get SIGPIPE and clean itself.
# trap on bash's EXIT signal to do proper cleanup.
mkfifo /tmp/monitor-nm-change
(
dbus-monitor --system "type='signal',interface='org.freedesktop.nm_dhcp_client'"
) > /tmp/monitor-nm-change &
exec </tmp/monitor-nm-change
rm /tmp/monitor-nm-change
while read EVENT; do
#change this condition to the event you're interested in
if echo "$EVENT" | grep -q BOUND6; then
# do something interesting
echo "current ipv6 addresses:"
ip addr show | grep inet6
fi
done
Вывод dbus-monitor непросто проанализировать в скриптах. Возможно, легче инициировать наличие определенных ключевых слов, например new_ip_address
, и оттуда использовать различные инструменты для получения информации, которая изменилась (например, ip или ifconfig).
# example output data from dbus-monitor for that signal
...
dict entry(
string "new_routers"
variant array of bytes "192.168.2.11"
)
dict entry(
string "new_subnet_mask"
variant array of bytes "255.255.255.0"
)
dict entry(
string "new_network_number"
variant array of bytes "192.168.2.0"
)
dict entry(
string "new_ip_address"
variant array of bytes "192.168.2.4"
)
dict entry(
string "pid"
variant array of bytes "12114"
)
dict entry(
string "reason"
variant array of bytes "REBOOT"
)
dict entry(
string "interface"
variant array of bytes "eth0"
)
...
Дать ему шанс!
dhclient-enter-hooks.d
скрипт ... но я никогда не пробовал! Существующий/etc/dhcp/dhclient-enter-hooks.d/resolvconf
скрипт может быть полезен с точки зрения синтаксиса и каких сигналов искать ("$reason" == "BOUND"
может быть