ฉันกำลังให้สคริปต์ที่ฟังสัญญาณ dbus ซึ่งจะช่วยให้คุณตอบสนองได้เร็วกว่าที่คุณสำรวจความคิดเห็นสำหรับการเปลี่ยนแปลงการกำหนดค่าเครือข่ายปัจจุบันของคุณ ช่วยในระบบที่สคริปต์ / etc / ไม่ถูกเรียกใช้เมื่อคุณต้องการให้พวกเขา (เช่นในระบบ 14.04 ของฉัน)
hooks enter / exit ของฉันไม่ทำงาน
NetworkManager เริ่ม dhclient ด้วยการตั้งค่าสถานะ-sf /usr/lib/NetworkManager/nm-dhcp-client.action
ซึ่งดูเหมือนจะแทนที่ลักษณะการทำงานของ hook ป้อน / ออกปกติ พฤติกรรมเริ่มต้นกับ dhclient /etc/dhcp/dhclient-{enter,exit}-hooks.d
คือการเรียกสคริปต์ใน สิ่งเหล่านั้นไม่ได้ถูกเรียกบนระบบของฉันเลย
สคริปต์ NetworkManager dispatcher.d ของฉันไม่ทำงาน
อย่างไรก็ตาม NM เรียกใช้สคริปต์ชุด/etc/NetworkManager/dispatcher.d
อื่นเพื่อแจ้งเหตุการณ์ต่าง ๆ หน้า man NetworkManager (8) กำหนดdhcp4-change
และdhcp6-change
การกระทำที่ดูเหมือนจะทำสิ่งที่คุณต้องการ แม้จะมีสิ่งที่ manpage พูด แต่อย่างน้อยในระบบของฉันเท่านั้นup
และdown
การกระทำที่ถูกเรียกใช้ ฉันไม่สามารถรับสคริปต์เหล่านี้เพื่อยิงสิ่งอื่นใดได้ ดังนั้นนี่จึงไม่ใช่หนทางที่ดีในการตรวจสอบการเปลี่ยนแปลง IP เช่นกัน
ดังนั้นสอดแนมโดยตรงกับสัญญาณ dbus ที่ส่งออกโดย NM
nm-dhcp-client.action
( แหล่งที่มา ) จากบรรทัดคำสั่งเพียงแปลงตัวแปรสภาพแวดล้อมทั้งหมดที่กำหนดโดย 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"
อาจ?)