私は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