编写Linux ARP表监控Bash脚本:MAC变更时记录时间至文件
修复ARP表监控Bash脚本
原脚本存在几处关键问题导致无法正常工作,以下是修正后的脚本及问题说明:
原脚本问题点
- 循环语法错误:
while true 10; do是无效写法,正确的无限循环应为while true; do,检测间隔通过循环内的sleep 10控制。 - 初始缓存文件为空:第一次运行时,空的
tempfile会和当前ARP表产生全量差异,导致误记录所有条目。 - 条件判断逻辑颠倒:原脚本用
if ! diff ...,含义是无差异时执行记录,实际需要有差异时才触发记录操作。 - 条目提取冗余:可通过awk直接过滤表头和统计行,无需额外sed处理。
修正后的脚本
#!/bin/bash # 配置参数 LOG_FILE="/home/user/arp_script/arp_changes.txt" TEMP_FILE="/tmp/arp_monitor_temp" SLEEP_INTERVAL=10 # 初始化缓存文件为当前ARP表 arp -e | awk 'NR>1 && !/Entries/ {print $1, $3, $5}' | column -t > "$TEMP_FILE" # 创建日志目录(如果不存在) mkdir -p "$(dirname "$LOG_FILE")" while true; do # 获取当前ARP表(过滤表头和统计行) arp -e | awk 'NR>1 && !/Entries/ {print $1, $3, $5}' | column -t > "$TEMP_FILE.new" # 对比缓存与当前ARP表,提取变化的条目 CHANGES=$(diff --changed-group-format="%>" --unchanged-group-format="" "$TEMP_FILE" "$TEMP_FILE.new") if [ -n "$CHANGES" ]; then # 记录变化前的对应条目(保留变更前状态) diff --changed-group-format="%<" --unchanged-group-format="" "$TEMP_FILE" "$TEMP_FILE.new" | ts '[%Y-%m-%d %H:%M:%S]' >> "$LOG_FILE" # 记录变化后的条目 echo "$CHANGES" | ts '[%Y-%m-%d %H:%M:%S]' >> "$LOG_FILE" # 更新缓存文件 mv "$TEMP_FILE.new" "$TEMP_FILE" else rm "$TEMP_FILE.new" fi sleep "$SLEEP_INTERVAL" done
脚本说明
- 初始化处理:脚本启动时先将当前ARP表写入缓存文件,避免首次运行的误记录。
- 差异对比:使用
diff的--changed-group-format参数分别提取变更前(%<)和变更后(%>)的条目,精准记录变化内容。 - 日志记录:通过
ts命令为每条记录添加时间戳,完全匹配需求格式。 - 资源清理:无变化时删除临时文件,避免冗余占用。
测试效果
使用macchanger -m <新MAC> <接口名>修改MAC地址后,等待10秒检测间隔,即可在/home/user/arp_script/arp_changes.txt中看到类似如下的记录:
[2023-05-09 03:56:23] 192.168.48.1 00:50:56:c0:00:01 ens37 [2023-05-09 03:59:23] 192.168.48.1 b2:ee:83:a7:c7:c7 ens37
内容的提问来源于stack exchange,提问作者Antonis_3345
相关产品推荐
相关产品推荐

