有没有办法知道 netcat 何时完成在机器之间传输文件?
当前命令:
机器#2: nc -lp 5555 > test.txt
机器#1: nc MachineIP Port < test.txt
传输发生了,但没有任何视觉指示表明它已完成。
小智 24
有不同版本的nc,您可以在nc(1) - Linux 手册页或nc(1) BSD 通用命令手册中找到连接应该在传输后立即关闭。两个链接站点上都有一个示例:
首先使用 nc 侦听特定端口,并将输出捕获到文件中:
Run Code Online (Sandbox Code Playgroud)$ nc -l 1234 > filename.out使用第二台机器,连接到监听 nc 进程,将要传输的文件提供给它:
Run Code Online (Sandbox Code Playgroud)$ nc host.example.com 1234 < filename.in文件传输完毕后,连接将自动关闭。
您netcat在传输后不会关闭连接,因此它与上述不同。它的行为就像我的 Netcat 1.10 在 Debian Jessie 上一样。这种行为记录在/usr/share/doc/netcat-traditional/README.gz(在我的机器上),粗体是我的:
在最简单的用法中,“nc host port”创建到给定目标主机上给定端口的 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.
Run Code Online (Sandbox Code Playgroud)
如果在发送端使用这个命令:
nc -q 0 MachineIP Port < test.txt
Run Code Online (Sandbox Code Playgroud)
nc将在读取 EOF 后 0 秒退出,即文件结束后。然后它将退出,接收端也将退出nc。
如果您想知道如果数据包没有通过会发生什么,请查看 Juraj 的评论。
当所有数据包都没有遇到时,系统将检测到这一点并在应用程序不通知的情况下重新传输它们(或者如果不可能,应用程序将收到超时错误)。可靠传递是OS内核提供的TCP协议的目的,它
nc使用。您可以请求不这样做的 UDP 协议,使用nc -u但事实并非如此。
2
上述 中有一个原始示例README.gz,它基于-w超时并且不需要-q在您的实现中存在选项。
Netcat 可以用作简单的数据传输代理,哪一端是侦听器,哪一端是客户端并不重要——一侧的输入作为输出到达另一侧。在没有指定超时的情况下在接收端启动侦听器,然后给发送端一个小的超时是有帮助的。这样监听器会一直监听直到您联系它,并且在数据停止流动后,客户端将超时、关闭并带走监听器。除非中间网络出现问题,否则这应该是完全可靠的,您可以随时增加超时。“rsh”的典型例子通常用于:一方面,
Run Code Online (Sandbox Code Playgroud)nc -l -p 1234 | uncompress -c | tar xvfp -然后在另一边
Run Code Online (Sandbox Code Playgroud)tar cfp - /some/dir | compress -c | nc -w 3 othermachine 1234将目录的内容从一台机器传输到另一台机器,而不必担心任何一端的 .rhosts 文件、用户帐户或 inetd 配置。