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

标签 linux logging

我有 2 个脚本。脚本“A”,脚本“B”。

脚本 A 在过去 2 分钟内定期查看日志中的 dhcpacks [dhcp release is configured to 2mins]。它每 2 分钟将 MAC 地址写入文件 [/dev/shm/dhcpacks-in-last-2min.txt]。好的,这是有效的,活跃的客户在这个文件中。 super 棒!

脚本 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. 确保您正在比较的文件已排序。最好的办法是修改脚本A。

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

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


在 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

关于linux - 如果文件更改,请发送有关差异的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4914575/

相关文章:

c - 如果应用程序在 lxc 容器中运行,则向 Netlink 发送消息失败并显示 ECONNREFUSED

java - Logback - 如何通过在日志语句上指定来写入任何日志级别?

python - 通过通配符设置 python 记录器级别

linux - 如何从证书文件(.crt 扩展名)生成证书请求和私钥文件(.pem 扩展名)

java - 从依赖于外部库的终端运行 java

c - SIGUNUSED 在头文件中的确切定义在哪里?

logging - 拦截来自 Ant 的 Commons 日志记录

javascript - PM2 - 如何从日志文件名中删除标识符

php - Freebsd 中用于循环 postfx 生成的邮件日志的默认工具是什么?

linux - 如何查找另一个文件中缺少的行