web-dev-qa-db-ja.com

パイピングとUDPでのNetcat / socatの動作?

これは linux-NetcatがUDPトラフィックのリッスンを停止する-スーパーユーザー に近いと思いますが、とにかく質問した方がいいと思いました

限り netcatのバージョン 私はUbuntu 11.04を使用しており、そのデフォルトのnetcatを使用しています。これはopenbsdの1つだと思います。

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

これは私が奇妙に思うことです:最初のケースは期待通りに機能します-私は1つのターミナルでUDPサーバーを開きます:

$ Sudo nc -ul 5000

...そして別の端末で新しいUDPクライアント接続を開始し、helloを3回入力して、それぞれの後にEnterキーを押します。

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

...そしてサーバーターミナルに戻ると、期待どおりにhelloが3回印刷されています。

$ Sudo nc -ul 5000 
hello
hello
hello
^C

これまでのところ、すべてが期待どおりに機能します。ただし、クライアントに入力をパイプすることによって、同じことを今やってみるとしましょう。したがって、最初に1つの端末でUDPサーバーを確立します。

$ Sudo nc -ul 5000

...そして別のデータでは、UDPクライアントとしてncにデータをパイプします。

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

...クライアントコマンドの後、シェルは一種の入力待ちのようにフリーズします。そのため、ここでhelloと入力し、Enterキーを2回押します。しかし、サーバーは最初のhelloechoを介してパイプされた)のみを登録しました。さらに、Ctrl-Cを押してクライアントのecho hello | nc -u 127.0.0.1 5000コマンドを繰り返し実行しても、サーバーはstillを報告したままになります。最初のhello

$ Sudo nc -ul 57130 
hello
^C

...そしてCtrl-Cでサーバーを停止して再起動した後にのみ、クライアントのecho hello | nc -u 127.0.0.1 5000コマンドを繰り返して、サーバーが機能していることを確認できます。

これはncの動作が想定されている方法ですか?サーバーを再起動しなくても、少なくともecho hello | nc -u 127.0.0.1 5000への繰り返し呼び出しが登録されると思いますか?それとも、そのような動作のための特別なコマンドラインスイッチがあるのでしょうか。

編集:私はこれを見つけましたPDFプレゼンテーション: socat –すべての種類のソケットの処理 、これには次のnetcatsocatが含まれていますノート:

netcat-制限
●ワンショットのみ(ソケットのクローズ後に終了)
...
例1:netcatの置き換え
...
●送信元ポートを持つUDPクライアント:
nc -­u ­-p 500 1.2.3.4 500
socat-udp:1.2.3.4:500、sp = 500
●TCPサーバー:
nc ­-l ­-p 8080
socat-tcp­-l:8080、reuseaddr
...

...ただし、サーバーコマンドを "socat - udp4-listen:5000,reuseaddr"に置き換え、クライアント行を "socat - udp:127.0.0.1:5000"に置き換えると、上記と同じ動作が得られます...パイプで入力、 "echo hello | socat - udp:127.0.0.1:5000"、唯一の違いは、ここでは少なくともWord helloが送信された後にコマンドが存在することです。ただし、このコマンドを連続して実行しても、サーバー、サーバーが再起動されるまで。

16
sdaau

OK、少なくともsocatで何かを得たと思います。つまり、オプションforkをサーバー行に追加する必要があります。

$ socat - udp4-listen:5000,reuseaddr,fork

...次に、別の端末で、コマンドラインでechoパイプラインをsocatクライアントラインに複数回呼び出すことができます。これは、すぐに終了するためです(まあ、0.5秒後:)):

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

...そして最初のターミナルに戻ると、サーバーが3つすべてのhellosを正常に表示していることがわかります。

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

fork- ed socatサーバーを使用している場合でも、echo "hello" | nc -u 127.0.0.1 5000は、ユーザーの入力を待つように「ロック」されます。ただし、Ctrl-Cを押してコマンドを再実行すると、次のようになります。

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

... fork- ed socatサーバーは、再起動する必要なく、3つのhellosを表示します。

どうやら、このopenBSD netcatにはforkオプションがないようですが、それに対応するものがあるかどうかはわかりません。

とにかく、これが誰かを助けることを願って、
乾杯!

23
sdaau

Netcatは、echoのstdoutからの出力を読み取るときにパイプを使用しているだけで、キーボードに「接続」されていません。期待どおりの応答を得るには、3つの「hello」をファイルに追加して実行します。

cat [myfile] | nc -u 127.0.0.1 5000
4
OldWolf

待ち受けncのトレースを行うと、netcatが接続を待機していることが示され、接続を取得すると、そのホストとポートに接続し、他はすべて無視します。続行するには「-k」を追加し、0秒後に各接続をタイムアウトするには「-w 0」を追加する必要があります。 Socatの方が良いと思います。

3
pdragon