有没有办法知道 netcat 何时完成在机器之间传输文件?
当前命令:
机器#2:nc -lp 5555 > test.txt
机器#1:nc MachineIP Port < test.txt
传输发生了,但没有任何视觉迹象表明它已完成。
答案1
首先一些背景
有不同的版本nc
,您可以在nc(1) - Linux 手册页或者nc(1) BSD 通用命令手册连接应在传输后立即关闭。两个链接网站上都给出了一个示例:
首先使用 nc 侦听特定端口,并将输出捕获到文件中:
$ nc -l 1234 > filename.out
使用第二台机器,连接到侦听 nc 进程,为其提供要传输的文件:
$ nc host.example.com 1234 < filename.in
文件传输完毕后,连接将自动关闭。
您netcat
在传输后不会关闭连接,因此它与上面描述的不同。它的行为就像我的,Debian Jessie 上的 Netcat 1.10。此行为记录在/usr/share/doc/netcat-traditional/README.gz
(在我的机器上)中,粗体是我的:
在最简单的用法中,“nc 主机端口”创建到给定目标主机上给定端口的 TCP 连接。然后,您的标准输入将发送到主机,并且通过连接返回的任何内容都将发送到您的标准输出。这种情况会无限期地持续下去,直到连接的网络端关闭。 请注意,此行为与大多数其他应用程序不同,大多数其他应用程序会在标准输入上的文件结束后关闭所有内容并退出。
以下是此行为背后的原因:
您可能会问“为什么不直接使用 telnet 连接到任意端口?”这是一个有效的问题,这里有一些原因。 Telnet 存在“标准输入 EOF”问题,因此必须在驱动脚本中引入经过计算的延迟,以允许网络输出完成。这是 netcat 保持运行直到网络侧面关闭。
维基百科有不同实现的总结。但我无法说出差异。也许其他人可以?
现在,解决方案
1
nc
读取文件后您可以告诉退出。这个选项很有用:
-q seconds after EOF on stdin, wait the specified number of seconds
and then quit. If seconds is negative, wait forever.
如果在发送端使用此命令:
nc -q 0 MachineIP Port < test.txt
nc
将在读取 EOF 后 0 秒退出,即文件结束后。然后它将退出,接收端也将退出nc
。
如果您想知道如果数据包无法通过会发生什么,请参阅 Juraj 的评论。
当所有数据包都没有到达时,系统将检测到这一点并在应用程序不通知的情况下重新传输它们(或者如果不可能,应用程序将收到超时错误)。可靠传输是操作系统内核提供的TCP协议的目的,它
nc
使用。您可以使用不执行此操作的 UDP 协议来请求,nc -u
但情况并非如此。
2
前面提到的有一个原始示例README.gz
,它基于-w
超时,并且不需要-q
在您的实现中存在该选项。
Netcat 可以用作简单的数据传输代理,哪一端是侦听器、哪一端是客户端并不重要——一侧的输入作为输出到达另一侧。在接收端启动监听器而不指定超时是有帮助的,然后给发送端一个小的超时。这样,监听器就会一直监听,直到您联系它为止,并且在数据停止流动后,客户端将超时、关闭并带走监听器。除非干预网络充满问题,否则这应该是完全可靠的,并且您始终可以增加超时。 “rsh”的典型示例经常用于:一方面,
nc -l -p 1234 | uncompress -c | tar xvfp -
然后在另一边
tar cfp - /some/dir | compress -c | nc -w 3 othermachine 1234
将目录的内容从一台计算机传输到另一台计算机,而不必担心两端的 .rhosts 文件、用户帐户或 inetd 配置。