NetworkManager 是一个网络工具,可以方便对系统网络进行配置监听,其中dispatcher可以响应变动,对相应的事件进行处理。详情可见
#!/bin/bash
# 需要监控的网段(支持正则表达式)
TARGET_NETWORK="192\\.168"
# 目标脚本路径(需要修改为你的实际脚本路径)
TARGET_SCRIPT="/home/deploy/auto_install.sh"
# 存储IP地址的目录
IP_STORE_DIR="/var/run/NetworkManager/dispatcher.d"
[ -d "$IP_STORE_DIR" ] || mkdir -p "$IP_STORE_DIR"
INTERFACE="$1"
EVENT_TYPE="$2"
# 只处理这些事件类型
case "$EVENT_TYPE" in
up|dhcp4-change|dhcp6-change|down|connectivity-change)
;;
*)
exit 0
;;
esac
# 获取当前符合目标网段的IPv4地址
current_ips=$(ip -4 addr show dev "$INTERFACE" 2>/dev/null | \\
awk '/inet/ {gsub(/\\/.*/, "", $2); print $2}' | \\
grep -E "^${TARGET_NETWORK}\\.")
# 获取之前保存的IP地址
ip_file="${IP_STORE_DIR}/${INTERFACE}.ip"
old_ips=$(cat "$ip_file" 2>/dev/null)
# 比较IP地址变化
if [ "$current_ips" != "$old_ips" ]; then
echo "IP changed: $current_ips" | systemd-cat -t ip-change-trigger
# 获取第一个IP(按需使用)
current_ip=$(echo "$current_ips" | head -n1)
# 带错误重定向的后台执行
"$TARGET_SCRIPT" "$current_ip" >/tmp/auto_install.log 2>&1 &
echo "$current_ips" > "$ip_file"
fi
exit 0
保存脚本命名成02_detect_ip_change.sh
,然后将代码移动到/etc/NetworkManager/dispatcher.d/
下
数字前缀可控制执行顺序