netcatからコマンドを受信した直後にgrepを終了するにはどうすればよいですか?

netcatからコマンドを受信した直後にgrepを終了するにはどうすればよいですか?

ポートを開いてコマンドをリッスンし、そのコマンドが入ったらすぐにスクリプトを実行したいと思います。

私が思いついた最高のものは次のとおりです(echoは私のスクリプトを置き換えます)。

nc -lk 9999 | grep -q runcommand && echo "running command"

、その後、テストのために実行します。

echo runcommand | nc localhost 9999

残念ながら、「runco​​mmand」を2番目に送信したときにのみテキストがエコーされるようです。

スクリプトがすぐに実行されるようにgrepをすぐに終了するにはどうすればよいですか?

答え1

このような構成something | grep -qで考えられる問題の1つは、grep終了後に左のコマンドが書き込みを試みる前にパイプが閉じているのを見ないことです。しかし、私のnetcat(Debianから来た)では、nc.openbsd与えられた場合でも終了しないようです。したがって、決してトリガーされません。しかし、macOSでnetcatを使って説明した動作を得ました。-kgrep&&

1つの可能性は、netcatをループで包むことです。これは私に適しているようです。

while true; do
    if nc -l 9999 | grep -q runcommand; then
        echo got correct string, exiting...
        break
    else
        echo got a connection, but not the correct string...
    fi
done

もちろん、まだnetcatを終了するようにトリガーしていない行を送信する問題がある場合は、その後にダミー行を送信していつでもそれを突くことができます。

printf "runcommand\n.\n" | nc localhost 9999

これが役に立つかどうかはわかりません。他のWebキャット間にはまだ違いがある可能性があります。

関連情報