web-dev-qa-db-ja.com

生き続けるnetcatにコマンドをパイプする方法は?

echo command | netcat Host port

これにより、コマンドがリモートホストに送信され、一部のデータが読み戻されます。しかし、数秒後に接続が閉じます。 -wパラメーターは何も変更しませんでした。 SuSE 10.1でnetcat v1.10を使用しています。

35
Chris

これは、OS Xのncコマンドで機能します(送信するコマンドがファイルにあると想定しています)。

cat file - | nc Host port

(基本的に、catはstdoutにファイルの内容をダンプしてから、stdinで待機します)。

さらに、シェル自体からコマンドを送信したい場合は、次のようにします。

cat <(echo command) - | nc Host port
36
Chaitanya Gupta

Ubuntuでncを使用する場合:

nc -q -1 Host port

buntu nc manページ から:

 -q seconds
         after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.

利用可能なncオプションはディストリビューション間で大きく異なるため、これはご使用のディストリビューション(OpenSUSE)では機能しない可能性があることに注意してください。

14

見つけた:

echo command | netcat Host port -

私の同僚はそれを知っていました。ドキュメントにはそれはまったく見当たりません。

13
Chris

ソケットのもう一方の端で接続が閉じている可能性がありますか?

デフォルトでは、ncは、完了後に接続を閉じます(-kオプションを使用して)待機するように明示的に指示しない場合:

 -k    Forces nc to stay listening for another connection after its current
       connection is completed.  It is an error to use this option without the
       -l option.

man nc.1をご覧ください。


私はこのように2台のマシン間でデータを正常にストリーミングしています:

  • 送信者:

    while (true); do 
      echo -n "$RANDOM " | nc <Host> <port>
    done
    
  • レシーバー:

    nc -kl <port> 
    
3
Campa

Netcatやsocatでこれを管理するつもりはないと思います。私は両方で大規模な調整を行ったばかりで、socatが最も有望に見えました。

リモートに接続するようにsocatを設定することができましたTCPポートとローカルのUNIXドメインソケットでリッスンします(理論的には常にリンクを維持できるため)が、ローカルUNIXソケット(UNIXソケットをstdin/outにリンクする別のsocat)から切り離されたプロセスは、TCP socatセッションを閉じました。

ここでの問題は、netcat/socatを介した各接続がサーバーへの新しいTCPストリーム接続を作成し、ローカルエンド時にそのTCPストリームセッションを閉じることです。切断します。

TCP接続をリモートエンドに開き、ソケット/パイプ/ fifoなどでローカルにリッスンする、このためのカスタムプロキシソフトウェアを作成する必要があると思います。既存のTCPパイプを介してデータを送信し、結果を返すだけです。

2
Majenko

Georgesの方法はインタラクティブシェルからはうまく機能しますが、スクリプトを作成するのに役立ちません。スクリプトをNohup ./script &として呼び出します。

Stdinをダミーのfifoで置き換えるとわかりました。

 mkfifo dummy
 cat command.txt dummy | nc Host port

Fifoには何も書き込まないため、ファイルを出力した後、catは無期限にハングします。

1
SF.

socatの_shut-none_オプションはここで役立ちます:

Changes the (address dependent) method of shutting down the write part of a connection to not do anything.

また、おそらく_-t <timeout>_を使用してデフォルトのタイムアウト期間をオーバーライドする必要があります。そうしないと、ソケットは0.5秒後に閉じられます。このオプションは、次のデフォルトの動作を上書きします。

_When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates._

したがって、次のようなコマンド:

_echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none_

'blah'を送信した後、ソケットを10秒間開いたままにします。

0
Jeremy

リモートホストが接続を閉じる(または到達できない)場合、またはパイプが終了する前にコマンドが終了すると(netcatが残りの入力キューを送信している間に)、コマンドが終了します。

0
allo