Tôi đang cung cấp một tập lệnh lắng nghe tín hiệu dbus, điều này sẽ cho phép bạn phản ứng nhanh hơn so với khi bạn thăm dò các thay đổi về cấu hình mạng hiện tại của bạn. Nó giúp trên các hệ thống mà tập lệnh / etc / không được thực thi khi bạn muốn chúng (như trên hệ thống 14.04 của tôi).
hook enter / exit của tôi không hoạt động
NetworkManager bắt đầu dhclient với cờ -sf /usr/lib/NetworkManager/nm-dhcp-client.action
dường như ghi đè hành vi hook nhập / thoát thông thường. Hành vi mặc định với dhclient là gọi các script trong /etc/dhcp/dhclient-{enter,exit}-hooks.d
. Những người không được gọi ở tất cả trên hệ thống của tôi.
Các kịch bản phân phối NetworkManager của tôi không hoạt động
Tuy nhiên, NM gọi một tập lệnh khác /etc/NetworkManager/dispatcher.d
để thông báo về các sự kiện khác nhau. Trang người dùng NetworkManager (8) xác định dhcp4-change
và dhcp6-change
hành động dường như sẽ làm chính xác những gì bạn muốn. Bất chấp những gì manpage nói, ít nhất trên hệ thống của tôi, chỉ up
và down
các hành động được viện dẫn. Tôi không thể có được những kịch bản đó để bắn vào bất cứ điều gì khác. Vì vậy, đây cũng không phải là một con đường tuyệt vời để theo dõi các thay đổi IP.
vì vậy, rình mò trực tiếp vào tín hiệu dbus do NM phát ra
nm-dhcp-client.action
( nguồn ), từ dòng lệnh, chỉ cần chuyển đổi tất cả các biến môi trường được đặt bởi dhclient thành tín hiệu dbus. Các biến môi trường được định nghĩa trong man dhclient-script
(8). Một trong những quan tâm đặc biệt là $new_ip_address
. Những gì bạn có thể làm, như được đề xuất bởi @Bernhard, là theo dõi tín hiệu và hành động phù hợp dựa trên nội dung của nó.
Đây là một chương trình sẽ theo dõi tất cả dữ liệu sự kiện được báo hiệu bởi nhị phân đó:
#!/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
Đầu ra của màn hình dbus không đơn giản để phân tích cú pháp trong các tập lệnh. Có lẽ dễ dàng hơn để kích hoạt sự hiện diện của một (các) từ khóa nhất định, ví dụ new_ip_address
, và từ đó sử dụng các công cụ khác nhau để có được thông tin đã thay đổi (ví dụ: ip hoặc 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"
)
...
Cho nó một phát!
dhclient-enter-hooks.d
kịch bản ... nhưng tôi chưa bao giờ thử nó!/etc/dhcp/dhclient-enter-hooks.d/resolvconf
Kịch bản hiện tại có thể hữu ích về mặt cú pháp và những tín hiệu nào cần tìm ("$reason" == "BOUND"
có thể?)