You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求编写脚本监控dhcpd.leases文件并记录指定租约信息至syslog或文件

请求编写脚本监控dhcpd.leases文件并记录指定租约信息至syslog或文件

嗨,我来帮你搞定这个dhcp租约监控的需求!下面提供两种实用方案,分别适配实时监控和定时扫描的场景,你可以根据服务器环境灵活选择:


方案一:实时监控(推荐,基于inotify-tools)

这种方式能在dhcpd.leases文件更新的瞬间触发解析,延迟极低,适合对时效性要求高的场景。

1. 先安装依赖工具

首先需要安装inotify-tools来监听文件变化:

  • Debian/Ubuntu系列:
    sudo apt update && sudo apt install inotify-tools -y
    
  • RHEL/CentOS/Rocky系列:
    sudo yum install inotify-tools -y
    

2. 编写监控脚本

创建名为dhcp-lease-trigger-monitor.sh的脚本,内容如下:

#!/bin/bash

# 定义dhcpd.leases文件路径(根据你的系统调整,常见路径如下)
LEASE_FILE="/var/lib/dhcp/dhcpd.leases"
# 定义要匹配的关键词
TRIGGER_STRING="trigger"
# 选择输出目标:syslog 或 文件,二选一
OUTPUT_TYPE="syslog"
# 如果选文件,定义输出文件路径
OUTPUT_FILE="/var/log/dhcp-trigger-leases.log"

# 监听文件的修改事件
inotifywait -m -e modify "$LEASE_FILE" | while read -r directory events filename; do
    # 用awk解析leases文件,提取符合条件的租约信息
    awk -v trigger="$TRIGGER_STRING" -v output="$OUTPUT_TYPE" -v outfile="$OUTPUT_FILE" '
        /lease [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {
            # 捕获当前租约的IP地址
            lease_ip = substr($2, 1, length($2)-1)
            mac_addr = ""
            circuit_id = ""
        }
        /hardware ethernet/ {
            # 捕获MAC地址(去掉末尾的分号)
            mac_addr = substr($3, 1, length($3)-1)
        }
        /option agent.circuit-id/ {
            # 捕获circuit-id(去掉前后的引号和末尾的分号)
            circuit_id = substr($2, 2, length($2)-3)
            # 检查是否包含触发关键词
            if (index(circuit_id, trigger) != 0) {
                # 组装日志内容
                log_msg = "DHCP Trigger Lease: IP=" lease_ip " MAC=" mac_addr " Circuit-ID=" circuit_id
                # 根据输出类型处理
                if (output == "syslog") {
                    # 发送到syslog,标签为dhcp-trigger-monitor
                    print log_msg | "logger -t dhcp-trigger-monitor"
                } else {
                    # 追加到指定文件
                    print strftime("%Y-%m-%d %H:%M:%S") " " log_msg >> outfile
                }
            }
        }
    ' "$LEASE_FILE"
done

3. 配置脚本运行

  • 给脚本添加执行权限:
    sudo chmod +x dhcp-lease-trigger-monitor.sh
    
  • 测试运行:
    sudo ./dhcp-lease-trigger-monitor.sh
    
  • 后台持久运行(可选):
    可以用systemd创建服务确保开机自启,创建/etc/systemd/system/dhcp-lease-monitor.service文件:
    [Unit]
    Description=DHCP Lease Trigger Monitor
    After=network.target dhcpd.service
    
    [Service]
    Type=simple
    ExecStart=/path/to/dhcp-lease-trigger-monitor.sh
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
    执行以下命令启用服务:
    sudo systemctl daemon-reload
    sudo systemctl enable --now dhcp-lease-monitor.service
    

方案二:定时扫描(基于cron)

如果环境无法使用inotify-tools,或者不需要实时监控,可以用定时任务定期扫描文件。

1. 编写扫描脚本

创建dhcp-lease-scan.sh:

#!/bin/bash

LEASE_FILE="/var/lib/dhcp/dhcpd.leases"
TRIGGER_STRING="trigger"
OUTPUT_TYPE="syslog"
OUTPUT_FILE="/var/log/dhcp-trigger-leases.log"
# 记录上次扫描的位置,避免重复输出(可选)
LAST_POS_FILE="/var/tmp/dhcp-lease-last-pos"

# 获取上次扫描的位置,默认从文件开头开始
last_pos=0
if [ -f "$LAST_POS_FILE" ]; then
    last_pos=$(cat "$LAST_POS_FILE")
fi

# 从上次位置开始读取文件
tail -c +"$last_pos" "$LEASE_FILE" | awk -v trigger="$TRIGGER_STRING" -v output="$OUTPUT_TYPE" -v outfile="$OUTPUT_FILE" '
    /lease [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {
        lease_ip = substr($2, 1, length($2)-1)
        mac_addr = ""
        circuit_id = ""
    }
    /hardware ethernet/ {
        mac_addr = substr($3, 1, length($3)-1)
    }
    /option agent.circuit-id/ {
        circuit_id = substr($2, 2, length($2)-3)
        if (index(circuit_id, trigger) != 0) {
            log_msg = "DHCP Trigger Lease: IP=" lease_ip " MAC=" mac_addr " Circuit-ID=" circuit_id
            if (output == "syslog") {
                print log_msg | "logger -t dhcp-trigger-scan"
            } else {
                print strftime("%Y-%m-%d %H:%M:%S") " " log_msg >> outfile
            }
        }
    }
'

# 更新上次扫描的位置
stat -c %s "$LEASE_FILE" > "$LAST_POS_FILE"

2. 配置cron定时任务

编辑crontab:

sudo crontab -e

添加一行,比如每5分钟运行一次:

*/5 * * * * /path/to/dhcp-lease-scan.sh

注意事项

  • 请根据系统调整LEASE_FILE路径,部分系统路径为/var/lib/dhcpd/dhcpd.leases
  • 如果需要记录所有租约而非仅含trigger的,删除脚本中if (index(circuit_id, trigger) != 0)的判断即可
  • 查看syslog记录:Debian/Ubuntu用grep dhcp-trigger-monitor /var/log/syslog,RHEL/CentOS用grep dhcp-trigger-monitor /var/log/messages

备注:内容来源于stack exchange,提问作者Tomsch112

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:20:31