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

编写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

脚本说明

  1. 初始化处理:脚本启动时先将当前ARP表写入缓存文件,避免首次运行的误记录。
  2. 差异对比:使用diff的--changed-group-format参数分别提取变更前(%<)和变更后(%>)的条目,精准记录变化内容。
  3. 日志记录:通过ts命令为每条记录添加时间戳,完全匹配需求格式。
  4. 资源清理:无变化时删除临时文件,避免冗余占用。

测试效果

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:25:35