主持人甲:
tar cf - stuff | dd | nc -N -l 12987
主持人乙:
nc a.example.com 12987 | dd | tar tf -
在主机 A 上完成dd
后打印其摘要tar
。因此很明显, tar 关闭了管道/文件 -> EOF
。
165040+0 记录 165040+0 记录输出 84500480 字节在 25.464802 秒内传输(3318325 字节/秒)
两个主机上都nc
愉快地坐在那里而不退出。
nc(1)
:
-N shutdown(2) the network socket after EOF on the input. Some
servers require this to finish their work.
因此,在主机 A 上nc
应该已经看到EOF
,关闭了该死的套接字,在主机 B 上nc
应该已经看到 TCP 连接终止并且应该已经关闭stdout
(stdin
的dd
/ tar
)。
如何告诉在主机 B 上nc
关闭stdout
/终止并在主机 A 上终止。
nc
漏洞?
-D
(调试)什么都不做。nc
连版本号都说不出来……唉
两台主机都是FreeBSD 10.3-RELEASE-p4,仅限 IPv4。
我也对 netcat 的行为感到困惑,所以我深入研究了代码。这是整个故事:
nc 服务器 (
nc -l
) 和客户端仅在相互连接关闭后退出。也就是说,如果双方都向对方发送了一个FIN数据包。服务器总是在收到来自客户端
FIN
的数据包后发送一个数据FIN
包。(除非服务器已经发送了一个FIN
数据包。)客户端发送一个 FIN 数据包:
EOF
,当使用参数运行时-N
EOF
,当服务器已经发送了一个 FIN 数据包时使用选项
-d
stdin 将被忽略,nc
其行为就像EOF
在 stdin 上遇到一样。选项
-N
总是意味着FIN
在遇到标准输入后发送EOF
。交换数据后退出nc进程的方法:
格奥尔格的回答
发送后
hello
,服务器EOF
在 stdin 上遇到发送,FIN
因为-N
.客户端接收到消息,并且由于在标准输入上
-d
看到EOF
并发送FIN
,因为服务器已经发送FIN
。连接关闭,客户端和服务器都退出。
客户端发起关闭
服务器在标准输入后保持连接打开
EOF
。客户端在 stdin 上看到
EOF
并发送FIN
,因为-N
.服务器
FIN
收到客户端的FIN
.连接关闭,客户端和服务器都退出。
nc
建立双向连接。即它stdin
从主机 B 发送到主机 A 以及从 A 到 B 的所需一个。-d
在主机 B 上使用忽略stdin
.-N
仍然需要在主机 A 上关闭TCP
EOF 上的连接。总之
主持人甲:
主持人乙: