ncat 命令在使用选项“-i”时给出空闲超时过期

ncat 命令在使用选项“-i”时给出空闲超时过期

我正在使用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该文件,然后将其通过管道传输到ncor ncat,但它不起作用。关于解决这个问题有什么建议吗?

答案1

问题肯定是-i选择。至少nc存在三个不同的版本。openbsd-netcat,gnu-netcatnmap-ncat

您可能从选项表示缓冲间隔nc的版本之一切换到表示超时的版本。因此,要么删除该选项,要么将其替换为.-inmap-i-i-d

-i下面我为提到的每个版本的选项整理了手册行nc。我还包含了-dnmap版本。

打开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-onlyor一起使用,或 (2) 在忽略 的错误代码的--recv-only情况下使用。nc

同时,以下解决方法之一可能会有所帮助:

  • 使用--send-only--recv-only(如果适合您的用例),
  • 将命令包装nctimeout命令中而不是使用-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 选项仅在文件传输结束时添加超时,因此不清楚您想用它实现什么

相关内容