netcatが応答を出力しない


12

私が使用してTCPポートにコマンドを送信しようとしているnetcatとのパイプ応答
、私が実行したときnetcat、それは正しく応答を出力しますが、私はパイプからコマンドを渡すとき、それは正確にコマンドを送信しますが、応答が印刷されない、私のコマンドを入力します。

したがって、これは正しく動作します:

netcat  localhost 9009

これはコマンドを送信するだけですが、応答を出力しません。

echo 'my_command' | netcat  localhost 9009

どうして?応答テキストを印刷
するnetcatにはどうすればよいですか?


これはおそらくあなたに起こっていることです
ジェフ・シャラー

@JeffSchaller:いいえ!残念ながらこれらのコマンドを使用しても効果はありません。今回は永久にブロックします!
RYN 2016年

どのnetcatを使用していますか?残念ながら、netcatツールにはさまざまなバリエーションがあり、すべてが同じように動作するわけではありません。また、リモートエンドには何がありますか?
Patrick

@Patrick:私のnetcatはOpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)バージョンです。リモートエンドはtelegram-cli同じマシン上にあります。
RYN 2016年

私はそのnetcatのmanページを見つけたと思いますが、私が何が起こっているのかを制御するフラグを見つけていません。私はかつている疑いがあるnetcat代わりに、ハーフクローズを行うと、その終了を閉じるには、リモート側のを待つのソケットの両側ダウン、それはすぐに閉まりこと、STDINにEOFを受け取ります。socatオプションの場合は、代わりに強くお勧めします。は1つしかsocatないため、さまざまなフレーバーが存在することで移植性の問題が発生することはありません。動作ははるかにまともであり、高度に構成可能です。
Patrick

回答:


8

@Patrickが言ったように、この問題は通常netcat、応答が与えられる前に終了することが原因です。これを修正する-q 2には、コマンドラインに追加しnetcatます。つまり、標準入力でEOFを検出してから約2秒後にハングするように指示します。もちろん、他の秒数だけ待機させることもできます。


ありがとう。-q 2動作しましたが、信頼できますか?それはウェブリクエストをしている私は常に2秒で十分だと確信することはできません!できますか?
RYN

1
より大きい数を使用して待機時間を長くするか、負の数を使用して無期限に待機させます。-w遊ぶオプションもあります。man ncもちろん、これはすべてこのページにあります。
RalphRönnquist2016年

5
それは言うinvalid option -- 'q'
phil294

良いフォローアップの質問は次のとおりです:なぜnc応答を待つのではなく、すぐに終了するのですか?接続がまだ開いている場合はnc、stdinが終了するだけでなく、接続が閉じるまで待機するオプションがあるはずです
theferrit32

6

これを使って:

cat <(echo command) - | nc host port

問題は、ncstdinが閉じられた直後に接続を閉じることです。これは、単純なmy_command文字列の場合は非常に高速であるため、応答を受信する機会がありません。(非常に大きなファイルをパイプ処理すると、ファイルの送信が完了する前に応答が返される場合があります)。

2番目の引数として入力:最初の引数の内容を送信した後、標準入力catでリッスンしてより多くのコンテンツをパイプスルーします。最初の引数は、コマンドを実行することです。コマンドを含むファイルである場合もあります。-catechocatcat < file - | ...

または、次のようにします。

(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port

これ#により、入力の2行目に無制限の文字が送信されます。使用#コメントとしてこれを無視し、リモートのようなbashのために作品を。ここでは10ミリ秒の短い待機時間を選択したので、接続終了時に反応が速くなります。YMMV。

その欠点は、それcatまたはwhileループであり、ncヒットする^C^Dシェル上になるまで実行し続けることができます。それは本当にリモートエンドに依存します。

-w 1(OSX netcat)または-i 1(nmapのncat)を使用してタイムアウトを追加すると、接続ncが1秒後に閉じcatられますが、いくつかの文字を入力してパイプが壊れるまで実行し続けるでしょう(と思います)。

ただし、コマンドを受信して​​処理した後、リモート側が接続を自動的に閉じる場合は機能します。これにより、ncクライアントとそのプロセスへのパイプ処理も終了します。

この回答は、同じスーパーユーザーの質問に対するこの回答に基づいています


{ echo my_command; cat;}同じことを行い、理解しやすいと考えられるかもしれません。
G-Manは 'Reinstate Monica'

1

異なるのOpenBSD-のnetcatのバージョンは、の異なる組み合わせを必要とする、風変わりです-w <seconds>-q <seconds>-Nとさえ接続のもう一方の端で実行されているものに応じて異なる引数を必要としています。特定のバージョンまたはサーバーでタイムアウトオプションを使用すると、遅延が発生し、それらを使用しないと、非常に長い(無限?)遅延が発生する可能性があります。そして、私はgnu netcatで異なる癖を期待しますが、それらのバージョン間で異なるかどうかはわかりません。

たとえば、archlinuxのバージョン1.130_3でこれを実行すると、非常に長い時間がかかります(永久に?)。

$ echo response | nc -l 9999 &
[1] 15190

$ time echo request | nc localhost 9999
request
response

(wait forever possibly)

ただし、サーバーまたはクライアントに-Nを追加すると機能します。


1

私はこれが少し古いことを知っていますが、私にとって他の答えはうまくいきませんでした、そしてこれはうまくいきました:

echo 'test' | netcat -N $server $port

に注意してください-N

入力のEOFの後にネットワークソケットをシャットダウンします。一部のサーバーは、作業を完了するためにこれを必要とします。

WindowsとLinuxの両方で私のために働いた。

注:これは、重複した質問に対して私が投稿した回答のコピーペーストです。

これは便利だと思います。これがポリシーなどに反する場合、Modは自由に編集/削除できます。

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