
私は OpenBSD netcat に特定のポート (3333) とインターフェース (10.42.0.1) で UDP 接続をリッスンさせ、固定の応答を送信させようとしています。これを実現するには、次の操作を行います。
echo "asd" | nc -k -u -l -p 3333 -s 10.42.0.1 -v
そして、次のようにしてメッセージを送信します。
echo qwe | nc -u 10.42.0.1 3333 -v
出力は
# Server side
Bound on h9ct3d3 3333
XXXXXqwe
# Client side
Connection to 10.42.0.1 3333 port [udp/*] succeeded!
ご覧のとおり、クライアントは を受け取りませんasd
。ただし、 を削除すると-k
、受信します。
##### Server side
echo "asd" | nc -u -l -p 3333 -s 10.42.0.1 -v
Bound on h9ct3d3 3333
# ...
# Wait for the client to execute
# ...
Connection received on h9ct3d3 51318
XXXXXqwe
##### Client side
echo qwe | nc -u 10.42.0.1 3333 -v
# ...
# Wait for the above 'X'to finish
# ...
Connection to 10.42.0.1 3333 port [udp/*] succeeded!
asd
なしで while ループを使用しようとしましたが-k
、nc
返されません。
#!/bin/bash
while true
do
echo "Host message" | nc -q 0 -u -l -p 3333 -s 10.42.0.1 -v
echo "restarting..."
done
どうすればこれを機能させることができますか?
私のnetcatのバージョンは次のとおりです:
OpenBSD netcat (Debian patchlevel 1.206-1ubuntu1)
PD。なぜnc
サーバーはこれらの奇妙な文字を「送信」するのでしょうかX
? クライアントはこれらの文字を読み取ることはなく、完了するまで待機するだけです。これらの文字は 1 秒ごとに表示されるようです。
答え1
サーバーはXを送信していません。クライアントは最初の2つの後に1秒間隔でXを送信し、サーバーはディスプレイ(当然のことですが-v
)クライアントXは送信も表示もされず、データはすぐに送信され表示されます(3秒後ではありません)。私にはわかりませんなぜ -v
「5X文字をゆっくり送信する」という意味です。
のマニュアルページには-k
こう書いてある
-u オプションと一緒に使用すると、サーバー ソケットは接続されず、複数のホストから UDP データグラムを受信できます。
これと一致して、サーバーは を使用するときログに-v
記録しますが、 を使用するときログには記録しません。Connection from {host} {port} received!
-ul
-ulk
容疑者「応答」データを送信するためのコードはソケットが接続されていることを前提としており、接続されていないままにしておくと応答が妨げられますが、ソースを詳しく調べて確認したわけではありません。
-q 0
UDP では検出可能な「接続の終了」がありませんが、TCP (FIN 交換) では検出可能な「接続の終了」があるため、動作しません。クライアント データについて認識可能なものがある場合 (head -1
常に 1 行である場合など)、論理的には、そのデータを認識してプロセスを強制終了し、ループを反復できるようにするものを作成することが可能ですnc
が、そのような認識/キラーで使用できる pid を取得する明確な方法を見つけることができませんでしたnc
。他の誰かがここで実際の解決策を提供できる場合に備えて、CW を作成します。