生き続けるnetcatにコマンドをパイプするにはどうすればよいですか?


32
echo command | netcat host port

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


接続を閉じるのはリモートホストではないのですか?
-grawity

はい。netcatを実行してからコマンドを手動で入力すると、netcatは無期限に存続します。
クリス・

なぜ生き続けるのでしょうか?エコーパラメータを出力して死ぬだけですか?
M'vy

1
リモートサーバーからのデータを引き続き受信できるように、生き続ける必要があります。
クリス

2
それは真実ではない。「netcat <host> <port>」は、双方向TCPソケットを開きます。
クリス

回答:


33

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

cat file - | nc host port

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

拡張により、シェル自体からコマンドを送信したい場合、これを行うことができます:

cat <(echo command) - | nc host port

netcatにはすべてのファンシーなオプションが欠けている、非常に単純な組み込みシステムで動作するので便利です。
SF。

{ echo command; cat;}同じことをし、理解しやすいと考えられるかもしれません。
G-マンは「元に戻すモニカ言う

1
私が見るように、netcatコマンドは入力の終わりを見るまでソケットを開いたままにします。これらのすべての例は、実際に理由をあまり述べずにこれを示しています。私はと対話していますサーバー使用だけで使用して長時間:。 SocketTest は、任意のTCPまたはUDPポートでリッスンまたはサービスを提供できる便利なツールです。SocketTest netcatcat - | nc localhost 8063
意志

14

ncUbuntuの上:

nc -q -1 host port

Ubuntuのncmanページ

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

利用可能なncオプションはディストリビューションによって大きく異なるため、これはあなたの(OpenSUSE)では動作しないかもしれないことに注意してください。


13

見つけた:

echo command | netcat host port -

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


2

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

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

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

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



2

ソケットのもう一方の端で接続が閉じられているのでしょうか?

デフォルトでは、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> 
    

1

Georgesのメソッドはインタラクティブシェルからはうまく機能しますが、スクリプトをとして呼び出す場合など、スクリプトの作成には役立ちませんnohup ./script &

stdinをダミーfifoのヘルプに置き換えることがわかりました。

 mkfifo dummy
 cat command.txt dummy | nc host port

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


0

socatshut-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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.