Bash脚本来监视linux的阿普表,如果有任何接口mac地址改变,输出到文件

ttcibm8c  于 2023-05-16  发布在  Linux
关注(0)|答案(2)|浏览(79)

我想写一个Bash脚本,检查Linux服务器的阿普表,如果接口MAC地址发生变化,那么它会将其记录到一个文件中,并注明发生变化的日期/时间。
我写了下面的脚本,并通过使用macchanger -m更改接口的MAC地址来测试它,但它似乎不能正常工作:

while true 10; do
   touch tempfile
   arp -e -v | awk '{print $1,$3,$5}' | column -t | sed "/Entries/d" >tempfile2
   if ! diff tempfile tempfile2 |grep ">"|cut -c 3-; then
        mv tempfile2 tempfile
        ts '[%Y-%m-%d %H:%M:%S]' <tempfile |
        tee -a /home/user/arp_script/arp_changes.txt
    fi
    sleep 10
done

阿普-e -v命令的输出示例:

Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.21.1             ether   00:50:56:c0:00:08   C                     ens33
_gateway                 ether   00:50:56:e9:05:e3   C                     ens33
192.168.21.254           ether   00:50:56:e3:ec:7a   C                     ens33
192.168.48.1             ether   00:50:56:c0:00:01   C                     ens37
192.168.21.130           ether   00:0c:29:44:6e:f4   C                     ens33
Entries: 5  Skipped: 0  Found: 5

例如,如果接口ens 37的mac地址更改为b2:ee:83:a7:c7:c7,那么我希望脚本将以下行输出到文件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
sdnqo3pr

sdnqo3pr1#

ts '[%Y-%m-%d %H:%M:%S]'tee看起来好像缺少了一个|:尝试ts '[%Y-%m-%d %H:%M:%S]' | tee
此外,使用>的I/O重定向意味着每次都要覆盖输出文件。您确定不想使用>>来追加到文件中吗?

lawou6xi

lawou6xi2#

您可以将上一次运行存储在临时文件中,仅在结果不同时才打印。

while true; do    
    touch tempfile
    if arp -e -v |   
        awk '!/^Address/ && !/^Entries/ {OFS="\t"; print $1,$3,$5}' |
        tee tempfile2 |
        diff -u tempfile - >tempfile3
    then
        sed -n '/^[-+] //p' tempfile3 |
        ts '[%Y-%m-%d %H:%M:%S]'
        mv tempfile2 tempfile
    fi
    sleep 10
done |
tee -a /home/user/arp_script/arp_changes.txt

正确的实现应该使用mktemp -d为临时文件创建一个临时目录,并在脚本中断时使用trap删除它。
也许更好的解决方案是将中间结果存储在变量中。

previous=""
while true; do
    result=$(arp -e -v | awk '!/^Address/ && !/^Entries/{ OFS="\t"; print $1, $3, $5 }')
    if [[ "$result" != "$previous" ]]; then
        diff -u <(echo "$previous") <(echo "$result") |
        sed -n 's/^[-+] //p' |
        ts '[%Y-%m-%d %H:%M:%S]'
    fi
    previous=$result
    sleep 10
done |
tee -a /home/user/arp_script/arp_changes.txt

如果您不想将第一个结果视为更改,那么应该不难找出如何扩展if条件,以便在前一个结果文件或变量为空时也不触发。

相关问题