Ich stelle ein Skript zur Verfügung, das dbus-Signale abhört, sodass Sie schneller reagieren können, als wenn Sie nach Änderungen an Ihrer aktuellen Netzwerkkonfiguration suchen würden. Es hilft auf Systemen, auf denen Skripte / etc / nicht ausgeführt werden, wenn Sie dies möchten (wie auf meinem 14.04-System).
Meine Ein- / Ausstiegshaken funktionieren nicht
NetworkManager startet dhclient mit dem Flag, -sf /usr/lib/NetworkManager/nm-dhcp-client.action
das das normale Ein- / Ausstiegsverhalten zu überschreiben scheint. Das Standardverhalten mit dhclient ist das Aufrufen von Skripten /etc/dhcp/dhclient-{enter,exit}-hooks.d
. Diese werden auf meinem System überhaupt nicht aufgerufen.
Auch meine NetworkManager-Skripte "dispatcher.d" funktionieren nicht
NM ruft jedoch einen anderen Satz von Skripten auf /etc/NetworkManager/dispatcher.d
, um über verschiedene Ereignisse zu informieren. Der Networkmanager (8) man - Seite definiert dhcp4-change
und dhcp6-change
Aktionen , die genau das zu tun scheint , was Sie wollen. Trotz allem , was zumindest die Manpage sagt, auf meinem System, nur up
und down
bekommen Aktionen aufgerufen. Ich kann diese Skripte nicht dazu bringen, auf irgendetwas anderes zu schießen. Daher ist dies auch kein guter Weg, um IP-Änderungen zu überwachen.
Schnüffeln Sie also direkt auf den von NM ausgegebenen D-Bus-Signalen
nm-dhcp-client.action
( source ) konvertiert von der Befehlszeile aus einfach alle Umgebungsvariablen, die von dhclient festgelegt wurden, in ein dbus-Signal. Diese Umgebungsvariablen sind in man dhclient-script
(8) definiert. Eines von besonderem Interesse ist $new_ip_address
. Wie von @Bernhard vorgeschlagen, können Sie das Signal überwachen und auf der Grundlage seines Inhalts entsprechend handeln.
Hier ist ein Programm, das alle von dieser Binärdatei signalisierten Ereignisdaten aufspürt:
#!/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
Die Ausgabe von dbus-monitor ist nicht einfach in Skripten zu analysieren. Vielleicht ist es einfacher, das Vorhandensein eines bestimmten Schlüsselworts auszulösen, z. B. new_ip_address
, und von dort aus verschiedene Tools zu verwenden, um die geänderten Informationen abzurufen (z. B. ip oder 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"
)
...
Versuch es einmal!
dhclient-enter-hooks.d
... aber ich habe es nie ausprobiert! Das vorhandene/etc/dhcp/dhclient-enter-hooks.d/resolvconf
Skript könnte in Bezug auf die Syntax und die zu"$reason" == "BOUND"