パイピングとUDPを使用したNetcat / socatの動作?


16

これは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

...そして別の方法では、ncUDPクライアントとしていくつかのデータをパイプします。

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

...クライアントコマンドの後、シェルは入力を待っているかのようにフリーズしhelloます。そこで、さらに2回入力してEnterキーを押します。しかし、サーバーは最初に登録されましたhello(経由でパイプされましたecho)。さらに、Ctrl-Cを押してクライアントecho hello | nc -u 127.0.0.1 5000コマンドを繰り返し実行しようとして、サーバーは最初の1つだけを報告し続けます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"で、唯一の違いはここで、コマンドは少なくとも単語helloが送信された後に存在します-ただし、このコマンドを連続して実行しても、サーバーが再起動されるまでサーバーで受信は行われません。

回答:


23

わかりました、少なくとも私は何かを手に入れたと思いますsocat-つまり、オプションをforkサーバー行に追加する必要があります:

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

...そして、別の端末では、我々は呼び出すことができますechoに配管をsocat、それは(すぐに終了しますと、クライアントラインコマンドラインで複数回半秒:)の後に、うまく):

$ 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つすべてを正常に表示したことがわかりますhello

$ 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サーバーはhello、再起動する必要なく3を表示します。

 

一見、このopenBSDにnetcatforkオプションがありません-しかし、それに対応するものがあるかどうかはわかりません。

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


4

netcatは、パイプを使用するときにエコーのstdoutからの出力のみを読み取り、キーボードに「接続」されなくなります。期待する応答を得るには、3つの「hello」をファイルに追加して実行します

cat [myfile] | nc -u 127.0.0.1 5000

こんにちは@OldWolf-回答ありがとうございます!私はあなたの提案を試みました(これはやや複雑な方法で、「cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000」)、しかし、私は3つを見てhelloいますが、私にはまだパズルがあります:そのコマンドも「入力」を待っているかのようにユーザー、およびCtrl-Cを押して再実行した後、サーバーは再起動されるまでデータを表示しません!?それが私がもっと知りたいことです-乾杯!
sdaau

2
ncはEOFで待機していますが、この場合、プログラムに終了シグナルを送信するまで取得できません。
オールドウルフ

ああ、そうですね-@OldWolfの説明に感謝します!どうやらオプションでsocatそれを回避することができforkます...再びありがとう、乾杯!
sdaau

3

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

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