Bashスクリプトは、特定のwhile / ifループのGotify Pushコマンドで中断されます。

Bashスクリプトは、特定のwhile / ifループのGotify Pushコマンドで中断されます。

私は開いている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全体がパイプから読み取られるように設定されているため、リダイレクトが必要です。コマンドgotifygotify標準入力(現在のパイプ)から読み取りを試み、ファイルの終わりに達するまでブロックできます。これはtail終了時にのみ発生します。リダイレクトを使用すると、</dev/nullパイプからデータを読み取ろうとしないように、パイプとの接続が切断された状態で実行できます。gotify

gotify私はこれがあなたが次のことを可能にすると信じています:

echo "my message" | gotify push

この機能を機能させるには、標準入力を読み取ろうとする必要があります。

関連情報