【问题标题】:Grepping and only sending e-mail if something found搜索并仅在发现某些内容时发送电子邮件
【发布时间】:2013-01-17 08:39:06
【问题描述】:
#!/bin/bash
( /usr/src/chkrootkit-$VERSION/chkrootkit ) | # Binary
grep 'INFECTED|Vulnerable' | # Only get found issues
/bin/mail -s 'CHROOTKIT Weekly Run ($SERVERNAME)' $EMAIL # Send EMail

即使没有找到,它仍然会发送电子邮件。

只有在某些东西被 grepped 时才发送的方法是什么?

【问题讨论】:

    标签: linux bash cron grep


    【解决方案1】:

    对于 GNU Mailutils,您可以使用 -E'set nonullbody' 执行类似的操作:

    grep whatever wherever | mailx -E'set nonullbody' -s EMAIL_SUBJECT your_email_address@example.com
    

    http://mailutils.org/manual/html_section/mail.html: 空体

    类型:布尔值
    默认值:真

    控制邮件是否接受正文为空的邮件。默认值 true 表示发送此类消息,并显示警告(传统上说“Null message body; hope that's ok”)。可以使用 nullbodymsg 变量设置警告的文本​​(见下文)。

    如果 nullbody 未设置,邮件将默默地忽略此类消息。这在“crontab”文件中很有用,以避免在没有重要事件发生时发送邮件。例如,仅当实用程序 some-prog 在其标准输出上输出某些内容或错误时,下面的“crontab”条目才会发送邮件:

    只需将上述内容放入 cron 中即可:

    */5 * * * * some-prog 2>&1 | /bin/mail -E'set nonullbody' -s 'Periodic synchronization'
    

    【讨论】:

      【解决方案2】:

      这也许……

      只需在邮件命令中使用-E 开关:

      man -Pcol\ -b mail | grep empty
           -E      Don't send messages with an empty body.
      
      
      #!/bin/bash
      ( /usr/src/chkrootkit-$VERSION/chkrootkit ) | # Binary
      grep 'INFECTED|Vulnerable' | # Only get found issues
      /bin/mail -E -s 'CHROOTKIT Weekly Run ($SERVERNAME)' $EMAIL # Send EMail
      

      或将您的支票放入crontab 以进行自动处理,例如每天一次:

      @daily  ( /usr/src/chkrootkit-$VERSION/chkrootkit ) | grep 'INFECTED|Vulnerable'
      

      如果命令有输出,Cron 会发送邮件。

      但是,重读后

      如果不需要转发警报中邮件的任何部分,则无需使用管道|

      所以你可以这样使用条件

      #!/bin/bash
      ( /usr/src/chkrootkit-$VERSION/chkrootkit ) | # Binary
          grep -q 'INFECTED|Vulnerable' &&
          /bin/mail -s 'CHROOTKIT Weekly Run ($SERVERNAME)' $EMAIL
      

      -q 切换到 grep 确保保持安静。

      【讨论】:

      • 不幸的是,常见的 GNU Mailutils 2.2 版本的邮件使用 -E 开关来执行命令,并且没有等效于您描述的“不要发送带有空正文的消息”开关。
      • 好的,第二部分使用grep -q而不是mail -E,这样就可以了。
      【解决方案3】:
      #!/bin/bash
      ( /usr/src/chkrootkit-$VERSION/chkrootkit ) | # Binary
      grep 'INFECTED|Vulnerable' # Only get found issues
      if [ $? -eq 0 ]
          /bin/mail -s 'CHROOTKIT Weekly Run ($SERVERNAME)' $EMAIL # Send EMail
      fi
      

      grep 如果找到匹配项,则返回非零退出代码,否则返回 0。我们只需要检查最后一个返回值(也就是grep的返回值),然后根据它有条件地发送邮件。

      【讨论】:

      • 你错过了grepmail之间的管道。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 2012-05-28
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多