在 bash 脚本中搜索多个条件

在 bash 脚本中搜索多个条件

我开始学习 bash 脚本并想从下面的脚本开始。这个想法是扫描 auth.log 查找失败的 ssh 登录,然后通过 notification-send 发送警报。我想做的是查找多个日志条目,而不仅仅是失败。但是,由于此脚本会查找 Failed,因此此后的任何内容都需要包含 Failed。

我尝试从尾部再次重复相同的部分,但是当然,脚本不会运行。由于我是新手,我不确定从哪里开始寻找答案。我并不是要求任何人解决这个问题,更重要的是,要做到这一点我需要使用 X。

我的目标是能够扫描 auth.log 中的多个条目,然后这些条目有自己的 do 行。我还希望能够扫描多个日志文件,而不仅仅是 auth.log。有人可以指出我需要为此做什么吗?谢谢。

#!/bin/bash

tail -fn0 /var/log/auth.log |
grep --line-buffered 'Failed' |
while read line
do
    notify-send 'SSH Login Failed' "$line"
done

答案1

也许可以在循环内使用正则表达式,而不是通过管道将 tail 的输出传递给 grep?

#!/bin/bash

tail -fn0 /var/log/auth.log |
while read line
do
    if [[ "${line}" =~ "Failed password" ]]; then
        notify-send 'SSH Login Failed' "$line"
        continue
    fi
    if [[ "${line}" =~ "different condition" ]]; then
        notify-send 'This condition happened' "$line"
        continue
    fi
done

对于 SSH 失败,大多数 *Ix 系统允许在关闭连接之前进行 3 次尝试。这可能会导致每次尝试失败都会发送 3 封电子邮件。

我很快起草了这个作为如何监视多个文件的示例。

#!/bin/bash
# vi: set ts=4 sw=4 noai ic showmode showmatch: 

monitor_log () {
tail -fn0 $1 |
while read line
do
    if [[ "${line}" =~ "Failed password" ]]; then
        notify-send 'SSH Login Failed' "$line"
        continue
    fi
    if [[ "${line}" =~ "different condition" ]]; then
        notify-send 'This condition happened' "$line"
        continue
    fi
done
} # end monitor_log

### Main Script ###

for file in /var/log/auth.log /var/log/syslog
do
    monitor_log "${file}" &
done

相关内容