如何知道何时NC完成文件传输


11

有没有办法知道netcat何时在机器之间传输文件?

当前命令:

机器2: nc -lp 5555 > test.txt

机器#1: nc MachineIP Port < test.txt

发生了转移,但是没有视觉指示表明转移已完成。

Answers:


19

首先一些背景

nc您可以在nc(1)-Linux手册页nc(1)BSD General Commands手册中找到不同版本的,该连接应在传输后立即关闭。在两个链接的站点上都有一个示例:

首先使用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 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.

如果在发送端使用此命令:

nc -q 0 MachineIP Port < test.txt

nc在读取EOF之后(即文件结束后)将退出0秒。然后它将退出,接收端也会退出nc

如果您想知道如果数据包不通过会发生什么情况,这是Juraj的评论。

当所有数据包都未通过时,系统将检测到该错误并在不通知应用程序的情况下重新传输它们(如果无法,则应用程序将收到超时错误)。可靠的传递是由OS内核提供的TCP协议nc使用的目的。您可以使用UDP请求不执行此操作的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配置。


我似乎无法使它正常工作。当我执行-q时,该命令不存在。我看到-w看起来很相似,但这不会导致连接退出
Anthony Russell

您的nc版本是?要检查:nc -h,第一行。

是的,它已经很老了。我在linux的旧映像上。我将对其进行更新,然后再尝试
安东尼·罗素

我更新了答案。

1
当所有数据包都未到达时,操作系统将检测到此情况并在不通知应用程序的情况下重新传输它们(如果仍然失败,则应用程序将收到超时错误)。可靠的传递是nc使用的OS内核提供的TCP协议的目的。您可以使用nc -u请求不执行此操作的UDP协议,但实际情况并非如此。
朱拉伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.