私は開いているsu / sshセッションのauth.logを監視する簡単なスクリプトを書いています。 su または ssh を使用して開かれたセッションを検出すると、Gotify を使用してプッシュメッセージを送信します。 Gotifyコマンドを独自のスクリプトに入れて実行してテストしましたが、うまくいきますが、whileループに入ると停止します。この質問で解決策を見つけました。メールコマンドでシェルスクリプトが中断されます。/ dev / nullの入力をgotifyコマンドにリダイレクトしますが、他のスクリプトで使用するのではなく、この特定のインスタンスでこれを行う必要がある理由はわかりません(リダイレクトなしで他のスクリプトがあります)。
スクリプトは次のとおりです。
#! /bin/bash
pipe=$(mktemp -u)
mkfifo "${pipe}"
log="/var/log/auth.log"
trap "rm -f $pipe" EXIT
tail -f $log >> $pipe &
while read line;
do
aryLine=(${line})
if [[ "${aryLine[@]:5:3}" =~ "pam_unix("(su|sshd)":session): session opened" ]]; then
echo "session opened for ${aryLine[@]:10:4}"
/usr/bin/gotify push -p 3 --title "login" "login from ${aryLine[10]}" < /dev/null
fi
done < $pipe
この特定のwhile / ifループでGotifyを使用するときにスクリプトがクラッシュするのを防ぐために、/ dev / nullが必要な理由がわかりません。ご理解をお願いいただきありがとうございます。以下のコードはうまく機能し、私のgotifyにスパムを送信します。
#! /bin/bash
while true; do
if true; then
/usr/bin/gotify push -p 3 --title "login" "login from ${aryLine[10]}"
fi
done
私は Debian ブルスアイを使っています。
答え1
コマンドを含む複合/dev/null
コマンドwhile .. do .. done < $pipe
全体がパイプから読み取られるように設定されているため、リダイレクトが必要です。コマンドgotify
はgotify
標準入力(現在のパイプ)から読み取りを試み、ファイルの終わりに達するまでブロックできます。これはtail
終了時にのみ発生します。リダイレクトを使用すると、</dev/null
パイプからデータを読み取ろうとしないように、パイプとの接続が切断された状態で実行できます。gotify
gotify
私はこれがあなたが次のことを可能にすると信じています:
echo "my message" | gotify push
この機能を機能させるには、標準入力を読み取ろうとする必要があります。