echo command | netcat Host port
これにより、コマンドがリモートホストに送信され、一部のデータが読み戻されます。しかし、数秒後に接続が閉じます。 -wパラメーターは何も変更しませんでした。 SuSE 10.1でnetcat v1.10を使用しています。
これは、OS Xのnc
コマンドで機能します(送信するコマンドがファイルにあると想定しています)。
cat file - | nc Host port
(基本的に、cat
はstdoutにファイルの内容をダンプしてから、stdinで待機します)。
さらに、シェル自体からコマンドを送信したい場合は、次のようにします。
cat <(echo command) - | nc Host port
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)では機能しない可能性があることに注意してください。
見つけた:
echo command | netcat Host port -
私の同僚はそれを知っていました。ドキュメントにはそれはまったく見当たりません。
ソケットのもう一方の端で接続が閉じている可能性がありますか?
デフォルトでは、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>
Netcatやsocatでこれを管理するつもりはないと思います。私は両方で大規模な調整を行ったばかりで、socatが最も有望に見えました。
リモートに接続するようにsocatを設定することができましたTCPポートとローカルのUNIXドメインソケットでリッスンします(理論的には常にリンクを維持できるため)が、ローカルUNIXソケット(UNIXソケットをstdin/outにリンクする別のsocat)から切り離されたプロセスは、TCP socatセッションを閉じました。
ここでの問題は、netcat/socatを介した各接続がサーバーへの新しいTCPストリーム接続を作成し、ローカルエンド時にそのTCPストリームセッションを閉じることです。切断します。
TCP接続をリモートエンドに開き、ソケット/パイプ/ fifoなどでローカルにリッスンする、このためのカスタムプロキシソフトウェアを作成する必要があると思います。既存のTCPパイプを介してデータを送信し、結果を返すだけです。
Georgesの方法はインタラクティブシェルからはうまく機能しますが、スクリプトを作成するのに役立ちません。スクリプトをNohup ./script &
として呼び出します。
Stdinをダミーのfifoで置き換えるとわかりました。
mkfifo dummy
cat command.txt dummy | nc Host port
Fifoには何も書き込まないため、ファイルを出力した後、cat
は無期限にハングします。
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秒間開いたままにします。
リモートホストが接続を閉じる(または到達できない)場合、またはパイプが終了する前にコマンドが終了すると(netcatが残りの入力キューを送信している間に)、コマンドが終了します。