我正在使用nc
命令将文件上传到设备,这就是我使用它的方式:
nc -i1 "device ip" "port" < /path/to/file
该命令在 Scientific Linux 6.4 32 位上运行良好,但升级到 CentOS 7.4 64 位后,该命令返回
Ncat: Idle timeout expired (1000 ms)
我意识到 RedHat 网站上有一个 bugzilla 项目这里,他们说正在nc
被替换ncat
,但它不起作用。我什至尝试了cat
该文件,然后将其通过管道传输到nc
or ncat
,但它不起作用。关于解决这个问题有什么建议吗?
答案1
问题肯定是-i
选择。至少nc
存在三个不同的版本。openbsd-netcat
,gnu-netcat
和nmap-ncat
。
您可能从选项表示缓冲间隔nc
的版本之一切换到表示超时的版本。因此,要么删除该选项,要么将其替换为.-i
nmap
-i
-i
-d
-i
下面我为提到的每个版本的选项整理了手册行nc
。我还包含了-d
该nmap
版本。
打开BSD:
-i interval Specifies a delay time interval between lines of text sent and received. Also causes a delay time between connections to multiple ports.
GNU:
-i SECS
--interval SECS sets the buffering output delay time. This affects all the current modes and makes the connection sock to buffer outgoing data. This means that in tunnel mode everything received from the listening socket is buffered for the connect socket.
国家地图:
-i, --idle-timeout <time> Idle read/write timeout
-d time, --delay time (Specify line delay)
Set the delay interval for lines sent. This effectively limits
the number of lines that Ncat will send in the specified period.
This may be useful for low-bandwidth sites, or have other uses
such as coping with annoying iptables --limit options.
答案2
ncat
这是RHEL7 中使用的nmap 版本的设计缺陷。我正在查看 7.70 版本的源代码(RHEL7 是 7.50,Fedora 28 是 7.60,我认为代码的这方面在 7.70 和 7.70 之间不会有太大变化)。
在ncat_connect.c
我可以看到代码:
- 模式下 stdin 上的 EOF 后退出
--send-only
, - 在模式下套接字上的 EOF 后退出
--recv-only
,
但是,如果既不是--send-only
也不是--recv-only
模式,则有没有什么ncat_connect.c
当我们在 stdin 和套接字上看到 EOF 时处理退出。
nsock_core.c
那么我们看一下snsock_loop
函数中的底层代码。如果设置了该循环将退出ms->quit
(通过上述--send-only
代码--recv-only
)或者如果没有events_pending
.
但这是错误:events_pending 中的超时计数。所以nsock_loop
“好吧,我知道标准输入已被 EOF'd 并且套接字已被 EOF'd,但我仍然不会退出,因为仍然有一个事件待处理”(超时),所以它只是坐在那里直到超时触发,然后nc 错误退出,即使一切实际上都运行得很好。
所以我认为我们应该直接向 nmap 提交错误报告(而不是向您的发行版:他们可能会说“这是我们没有资格评估的上游行为”,而上游维护者将要能够评估它):我们指出,上述设计实际上-i
是无用的,除非 (1) 与--send-only
or一起使用,或 (2) 在忽略 的错误代码的--recv-only
情况下使用。nc
同时,以下解决方法之一可能会有所帮助:
- 使用
--send-only
或--recv-only
(如果适合您的用例), - 将命令包装
nc
在timeout
命令中而不是使用-i
, - 手动安装不同版本的
nc
,例如 GNU Netcat 或原始 nc-1.10 — 但要在 RHEL7 或 Fedora 28 上执行此操作,您需要将要需要手动安装,因为软件包(当前)仅提供nmap-ncat
.
答案3
我已经启动了centos7容器并且可以重现您的错误:
[root@34630a8f0b7c /]# nc 192.168.1.210 1234 < sarassa
[root@34630a8f0b7c /]# nc -i 1 192.168.1.210 1234 < sarassa
Ncat: Idle timeout expired (1000 ms).
-i 选项仅在文件传输结束时添加超时,因此不清楚您想用它实现什么