nc 命令功能非常强大,使用非常方便。关于它的使用,网上有很多资料可以了解到,这里就不再赘述。
本片文章源自于我在尝试通过 nc 传输文件时,发现文件传输完之后,连接没有自动断开,只有手动输入 Ctrl-C 之后才断开连接。
而在另一台机器上,使用nc命令传输文件时,使用Ctrl-C和Ctrl-D都可以关闭连接。
在无法Ctrl-D断开连接的机器上通过man查看nc的参数,发现有一个 -q 参数可以指定EOF作为断开的条件。
-q seconds after EOF on stdin, wait the specified number of seconds and then quit. If
seconds is negative, wait forever.
后来查了一下,发现不同版本的 nc 在断开连接上有些区别:
引用:https://zhuanlan.zhihu.com/p/83959309
老版本的 nc 只要 CTRL+D 发送 EOF 就会断开,新版本一律要 CTRL+C 结束,不管是服务端还是客户端只要任意一边断开了,另一端也就结束了,但是 openbsd 版本的 nc 可以加一个 -k 参数让服务端持续工作。
.
老版本 GNU / OpenBSD 的 netcat 再文件结束(标准输入碰到 EOF),发送文件一端就会关闭连接,而新版本不会,你需要再开个窗口到 A 主机上看看接收下来的文件尺寸和源文件比较一下判断传输是否结束。
.
对于新版 OpenBSD 的 netcat 有一个 -N 参数,可以指明 stdin 碰到 EOF 就关闭连接(和老版本一致)
.
GNU 版本的 netcat 也有可以加个 -q0 参数,达到和 openbsd 版本 -N
另外,使用 nc 命令传输文件,相对比 scp 传输文件要快,因为少了数据加密的过程。但是切记要对文件的完整性进行检查,例如使用 md5sum 检查两台机器之间的文件md5是否相同。