Netcat/socat 与管道和 UDP 的行为?

Netcat/socat 与管道和 UDP 的行为?

我想这接近linux – Netcat 停止监听 UDP 流量,但我觉得我还是应该问一下

据,直到...为止netcat 的版本我正在使用 Ubuntu 11.04 及其默认版本netcat,我猜测它是openbsd

$ 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]]

 

这就是我觉得奇怪的地方:第一种情况按预期工作——我在一个终端中打开一个 UDP 服务器:

$ sudo nc -ul 5000

...在另一个终端中我启动了一个新的 UDP 客户端连接 - 我输入了hello三次,每次之后都按 ENTER 键:

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

...回到服务器终端,它打印了hello三次,正如预期的那样:

$ sudo nc -ul 5000 
hello
hello
hello
^C

 

到目前为止一切顺利,一切都按预期进行。但是,假设我现在尝试通过将输入管道传输到客户端来实现相同的目的;因此首先在一个终端中建立一个 UDP 服务器:

$ sudo nc -ul 5000

... 在另一个客户端中,将一些数据传输到ncUDP 客户端:

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

... 在客户端命令之后,shell 有点冻结,好像在等待输入 - 因此我hello又输入了两次并按了 ENTER;但服务器只注册了第一次hello(通过管道传输echo)。此外,即使您按 Ctrl-C 并尝试重复客户端echo hello | nc -u 127.0.0.1 5000命令,服务器也会仍然继续报道第一个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 – 处理所有类型的套接字,其中包含以下netcatvssocat注释:

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发送后存在 - 但是,再次,连续运行此命令不会导致服务器接收,直到服务器重新启动。

答案1

好的,我认为至少我得到了一些东西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

...回到第一个终端,我们可以看到服务器已成功显示所有三个hello

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

 

请注意,即使使用fork-edsocat服务器,该行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

...- forkedsocat服务器将显示三个hellos,而无需重新启动..

 

看起来,这个 openBSDnetcat没有fork选项 - 但我不确定它是否有与之对应的选项。

无论如何,希望这对某人有帮助,
干杯!

答案2

当您使用管道时,您的 netcat 只会读取 echo 的标准输出,它不再“连接”到键盘。要获得您期望的响应,您可以将三个“hello”添加到文件中并运行

cat [myfile] | nc -u 127.0.0.1 5000

答案3

如果您对正在监听的 nc 进行 strace,它将显示 netcat 正在等待连接,一旦它获得连接,就会连接到该主机和端口,忽略所有其他主机和端口。您需要添加“-k”以继续运行,并添加“-w 0”以在 0 秒后使每个连接超时。我认为 Socat 是更好的选择。

相关内容