如果文件更改发送有关差异的电子邮件

时间:2011-02-06 13:33:39

标签: linux logging

我有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地址将为离开它,我需要知道,是谁[贴上我的脚本 - 但有些事情错了]。

感谢您的帮助..我已经将我的脚本连续几天了......:\

1 个答案:

答案 0 :(得分:4)

  1. 确保您要比较的文件已排序。最好的方法是修改脚本A.

  2. 您的脚本正在尝试解析统一的差异。除非另有说明(使用-u),diff会输出“正常”差异,其中的变化标记为<>

  3. 您必须使用两个换行符分隔邮件标题和正文。


  4. 在Linux上,观看文件的最佳方式是通过Inotify,inotifywaitincron

    我尝试重写脚本:

    #!/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