请求编写脚本监控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.targetsudo 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
相关产品推荐
相关产品推荐

