NetworkManager 是一个网络工具,可以方便对系统网络进行配置监听,其中dispatcher可以响应变动,对相应的事件进行处理。详情可见

NetworkManager Dispatcher

创建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/

数字前缀可控制执行顺序