Bashスクリプトで複数の条件を検索する

Bashスクリプトで複数の条件を検索する

私はbashスクリプトを学び始め、次のスクリプトで始めたいと思いました。アイデアは、auth.logで失敗したSSHログインを検索し、通知を送信して警告を送信することです。私が望むのは、単に失敗ではなく、複数のログエントリを見つけることです。ただし、このスクリプトはFailedを見つけるため、以降のすべての項目にFailedを含める必要があります。

同じ部分を最後からやり直してみましたが、当然スクリプトが実行されませんでした。私はこれに慣れていないので、どこで答えを探し始めるべきかわかりません。私は誰にもこの問題を解決するように頼みません。さらに重要なことは、この問題を解決するにはXを使用する必要があることです。

私の目標は、auth.logで複数の項目をスキャンしてから、その項目に一意の行を持つようにすることです。また、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

関連情報