我有2个脚本。脚本“A”,脚本“B”。
脚本A在过去的2分钟内定期观察日志中的dhcpacks
[dhcp版本配置为2分钟]。它每2分钟将MAC地址写入文件[/dev/shm/dhcpacks-in-last-2min.txt
]。好的,这是有效的,活跃的客户端在这个文件中。超强!
脚本B:On pastebin
我正在尝试创建一个脚本,用于监视/dev/shm/dhcpacks-in-last-2min.txt
文件中的更改(每1秒)。好。但是:我的观察者脚本the pastebined工作不正常 - 有时候它会发送,有时会发送给某人XY logged out
,但事实并非如此!什么都没发生,问题不在脚本A中。
有人可以帮助我指出,我错过了什么?如何查看仅包含MAC地址的文件(每秒),如果有人在2分钟内未获得dhcpack
,则文件/dev/shm/dhcpacks-in-last-2min.txt
会更改,并且客户端MAC地址将为离开它,我需要知道,是谁[贴上我的脚本 - 但有些事情错了]。
感谢您的帮助..我已经将我的脚本连续几天了......:\
答案 0 :(得分:4)
确保您要比较的文件已排序。最好的方法是修改脚本A.
您的脚本正在尝试解析统一的差异。除非另有说明(使用-u
),diff
会输出“正常”差异,其中的变化标记为<
和>
。
您必须使用两个换行符分隔邮件标题和正文。
在Linux上,观看文件的最佳方式是通过Inotify,inotifywait
或incron
。
我尝试重写脚本:
#!/usr/bin/env bash
rcpt=MYEMAIL@MYDOMAIN.COM
file=/dev/shm/dhcpacks-in-last-2min.txt
cp "$file" "$file.old"
inotifywait -qme modify "$file" | while read -r _; do
if ! cmp -s "$file.old" "$file"; then
changes=$(diff "$file.old" "$file" | sed -n "s/^</logged out:/p; s/^>/logged in:/p" | tr A-Z a-z)
subj="$(date) - $(hostname) - $(echo "$changes" | sed "s/$/,/" | tr "\n" " ")"
# In a well-configured system, this would be enough:
#mail -s "$subj" "$rcpt" <<< "$changes"
# But if yours is not,
echo -e "From: <$rcpt>\nSubject: $subj\nTo: <$rcpt>\n\n$changes\n" | ssmtp "$rcpt"
cp "$file" "$file.old"
fi
done