web-dev-qa-db-ja.com

データの送信後にnetcat接続を自動的に閉じる方法は?

スクリプトから次のコマンドを実行しています。

echo '{"hostUp": true}' | Sudo /usr/local/bin/netcat localhost 8001

ただし、netcatクライアントは無期限に開いたままになります。このデータが送信された後、どうすれば接続を閉じることができますか?

25
Justin Meltzer

他の両方の回答-c-qは正しいコンテキストでは正しいですが、複数の回答がある理由を要約し、より一般的な解決策を提供するのに役立つ場合があります。

これらの異なるオプションは同じことを行いますが、netcatの異なる実装です。

  • -c GNU netcatの実装
  • -q netcatのOpenBSD実装。
  • -w(その他?)OpenBSDのnetcatの実装。

一部のバージョンでは、-qおよび-wオプションを終了する前に待機する秒数を指定するintが必要です。バージョンに応じて、このintは> 0または>= 0でなければなりません。

複数のマシンに何かを実装していて、それらがnetcatの同じ実装を使用していることが確実でない場合は、netcat呼び出しをtimeoutプログラムでラップして、数秒後にnetcatを強制終了することを検討してください。

timeout 5 echo '{"hostUp": true}' | netcat localhost 8001

このアプローチは、データが正常に送信されているかどうかに関係なくnetcatの実行に上限を設けるため、少し扱いに​​くいですが、少量のデータを送信していて数秒の余裕がある場合、これは機能するはずです。 netcat実装を使用。

19
7yl4r

-qパラメーターを使用できますが、netcatサーバーも閉じられます。

$ echo '{"hostUp": true}' | Sudo /usr/local/bin/netcat -q 5 localhost 8001    
5
cuonglm

私の場合、Homebrew(v 0.7.1)を介してインストールしたMacで使用していたnetcatのコピーには-qオプションがありませんでしたが、-cオプションを使用してSTDINを閉じることができましたEOFそしてコマンド全体をループに入れます:

while true ; do printf 'HTTP/1.1 200 OK\r\n\r\ncool, thanks' | netcat -l -c -p 8888 ; done
3
jmaxyz

Windows -w 5(1秒以上で閉じるまでの秒数)

Windowsのブロードキャストアドレスにudpで「hello」を送信し、1秒後に閉じる例:

echo hello|nc -w 1 -u 10.0.30.255 -p 4000 5000
1
Roel

Ubuntu 18.04サーバーでは、次を使用する必要がありました:(manページにあります)

echo '{"hostUp": true}' | Sudo /usr/local/bin/netcat -N localhost 8001

明らかに-N と類似しています -qまたは-c他のディストリビューション

1