スクリプトでnetcatを使用する際に問題がありますbash
。
コマンドを送信した後、特定の出力を一致させ、できるだけ早くスクリプトの実行を続けたい(netcatタイムアウトを待たずに)。
$> echo 'my_command' | nc -q 10 <IP> <PORT> | grep -m 1 EXPECTED_OUTPUT
# ISSUE: Closes the connection quite instantly
$> echo $?
$> 1 # grep did not get (yet) the output of nc
もう一つの試み:
$> echo 'my_command' | nc -w 1 <IP> <PORT> | grep -m 1 EXPECTED_OUTPUT
Binary file (standard input) matches
# ISSUE: Wait until the timeout expires
$> echo $?
$> 0
詳細は:
コマンドがなければ、netcatはバナーメッセージを出力します。
$>nc <IP> <PORT>
welcome message
私は他のツールに反対することはありません(telnet
、...)
規格に準拠したソリューションが必要ですbash
。
-w 1
予想されるメッセージは1秒以内に到着する必要があるため、タイムアウトを使用しました。nc
答え1
nc
完了したらgrep
死ぬように設定したいと思います。 1つの方法は次のとおりです。
( subshell_pid=$BASHPID ; echo 'my_command' | nc $IP $PORT > >(grep -m 1 EXPECTED_OUTPUT ; kill -13 -- -$subshell_pid ; ) )
これらはすべて、サブシェルで実行され、grep
完了すると、サブシェルによって開始されたすべてのプロセスを終了します。
>()
これはプロセスの交換, 1 つのコマンドから複数のコマンドに転送できます。