2

我设置了一个 crontab。我已经安装了 AIDE,并且我有一个 AIDE 数据库来检查文件的完整性。

当文件被修改时,如何让 cron 给我发送电子邮件?

剧本:

#!/bin/bash 

if aide -c /etc/aide/aide.conf --check
    then echo "AIDE detected no changes"
else
    echo "Alert!: AIDE detected changes!"

crontab:

* */12 * * * /root/script.sh | mail root@localhost.com 
4

4 回答 4

2

使用MAILTOcrontab 变量而不是管道到mail. 然后更改您的脚本,使其不输出任何内容,除非出现问题:

#!/bin/bash 
aide -c /etc/aide/aide.conf --check || echo "Alert!: AIDE detected changes!"

crontab:

MAILTO=root@localhost.com
* */12 * * * /root/script.sh 
MAILTO=""

笔记:

  1. 您可以改用简单的(本地)用户名;例如root
  2. 您需要在系统上设置邮件处理;例如,通过外部 SMTP 服务提供商(如 Gmail)传递到本地邮箱或中继。这超出了本问答的范围。
  3. MAILTO=""是停止遵循 cron 规则发送邮件。如果您希望他们这样做,请忽略它。一定MAILTO=""不是MAILTO=。(Cron 在这里没有实现 shell 语法。另一个线索是你可以在周围放置空格,=而你不能使用 shell 语法。)
  4. 变量的设置crontab不是POSIX 规范的一部分。多年来已经有许多实现,cron但并非所有实现都支持变量设置。检查man 5 crontab系统上的内容。

或者,您可以使用... | mailx -E root@localhost.com而不是... | mail root@localhost.com. 如果正文(即标准输入)为空,这将跳过发送邮件。

于 2020-05-23T05:03:57.840 回答
1

仅当文件被修改时,如何让 cron 给我发送电子邮件?

如果您在具有本地文件系统(例如ext4(5)BTRFS)的 Linux 上,请考虑使用inotify(7)工具,然后安装incrond(在 Debian 或 Ubuntu 上:该incron软件包)并使用incrontab(5)

请注意,incron不要inotifyNFSSMB/CIFS等远程文件系统或proc(5)等伪文件系统上工作。

如果你不能使用incron,你需要在你的 shell 脚本中使用find(1)或者stat(1)定期调用cron

顺便说一句,某些文件(例如,在 下的文件/var/run/,请参阅hier(7)了解更多)经常被修改。RDBMS(如PostGreSQL)处理的数据文件也是如此

关于AIDE,请务必阅读其文档。由于它是开源甚至是免费软件,考虑研究然后改进它的代码(例如使用inotify)。

于 2020-05-23T05:11:56.547 回答
1

我们编写了一个 Perl 脚本,如果出现问题,它会发送一封电子邮件更新数据库,这样这封电子邮件就不会再次发送出去。

#!/usr/bin/perl
my $aide =  "/usr/sbin/aide -c /etc/aide.conf";
my $email = "security\@your-domain.com";
my $timestamp = `/bin/date +\%Y-\%m-\%d.\%H-\%M`;
my $output = "";
my $added = -1;
my $removed = -1;
my $changed = -1;
my $warning = 0;
my $found_no_differences = 0;
open(AIDE, "$aide --check|");
while (my $line=<AIDE>) {
    chomp($line);
    $output = $output.$line."\n";
    if ($line =~ /Added entries\:\s*(\w+)/) { $added = $1; }
    if ($line =~ /Removed entries\:\s*(\w+)/) { $removed = $1; }
    if ($line =~ /Changed entries\:\s*(\w+)/) { $changed = $1; }
    if ($line =~ /WARNING\:/) { $warning = $warning + 1; }
    if ($line =~ /AIDE found NO differences/) { $found_no_differences = 1; }
}
close(AIDE);
if ($found_no_differences > 0) { exit(0); }
if ($added > 0 || $removed > 0 || $changed > 0 || $warning > 0 || $added == -1 || $changed == -1) {
    open MAIL, "|mail -s 'AIDE $timestamp' $email";
    print MAIL $output;
    close MAIL;
    system("$aide --init");
    system("mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz");
}
于 2020-12-19T22:04:49.007 回答
0

默认情况下,助手会向本地 root 用户发送电子邮件,最好为本地 root 用户创建一个别名到 noc@domain.com 或您用于传入电子邮件地址的任何内容,这样您不仅可以收到助手电子邮件,还可以收到其他系统发往 root 用户的邮件

于 2021-07-30T09:09:33.403 回答