dbus 신호를 수신하는 스크립트를 제공하므로 현재 네트워크 구성의 변경 사항을 폴링하는 것보다 빠르게 반응 할 수 있습니다. 원할 때 / etc / 스크립트가 실행되지 않는 시스템 (내 14.04 시스템에서와 같이)에서 도움이됩니다.
내 입장 / 퇴장 훅 .d 작동하지 않습니다
NetworkManager는 -sf /usr/lib/NetworkManager/nm-dhcp-client.action
정상적인 입력 / 종료 후크 동작을 대체하는 것으로 보이는 플래그로 dhclient를 시작합니다 . dhclient의 기본 동작은에서 스크립트를 호출하는 것입니다 /etc/dhcp/dhclient-{enter,exit}-hooks.d
. 그것들은 내 시스템에서 전혀 호출되지 않습니다.
내 NetworkManager dispatcher.d 스크립트가 작동하지 않습니다
그러나 NM은에서 /etc/NetworkManager/dispatcher.d
다양한 이벤트를 알리기 위해 다른 스크립트 세트를 호출 합니다. NetworkManager (8) 매뉴얼 페이지는 원하는대로 정확하게 수행 할 수있는 작업을 정의 dhcp4-change
하고 dhcp6-change
수행 합니다 . 맨 페이지의 말씀에도 불구하고, 내 시스템에 적어도 만 up
하고 down
행동은 호출 얻을. 그 스크립트를 다른 곳에서 실행할 수 없습니다. 따라서 이것은 IP 변경을 모니터링하기에 좋은 방법이 아닙니다.
따라서 NM에서 방출 된 dbus 신호에서 직접 스누핑
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"
아마도?)