【问题标题】:nc (netcat) on Mac OS X 10.8.4 gets stuckMac OS X 10.8.4 上的 nc (netcat) 卡住
【发布时间】:2013-09-05 21:04:49
【问题描述】:

我在 Mac OS X 上使用 nc 实用程序时遇到了一个小问题,我经常使用该实用程序作为快速而肮脏的解决方案来检查端口是否打开以及守护程序正在运行的版本。

前几天我们部署了一组新计算机,我想验证它们运行的​​是什么版本的 sshd,而不必离开我的椅子。

这是我运行的命令和结果输出:

$ for i in {183..200}; do echo "hello" | nc -n -w 2 -v 10.120.113.$i 22; done
Connection to 10.120.113.183 22 port [tcp/*] succeeded!
SSH-2.0-OpenSSH_5.9
Protocol mismatch.
nc: connect to 10.120.113.184 port 22 (tcp) failed: Connection refused
^C
$

它在 183 上找到第一台机器并返回守护程序版本,它看起来不像 sshd 在 184 上运行,但是当它达到 185 时它就停止了,我必须用 ctrl+c 杀死它。

据我了解,nc 的手册页在使用“-w”开关时应该会超时,但事实并非如此。多台机器出现同样的问题。

这仅仅是我误解手册页的情况吗? 如果没有收到任何响应,还有其他方法可以让 nc 在 X 秒后超时吗? 有没有其他方法可以使用 Mac OS X 中的内置工具来做到这一点?

我也尝试过仅使用“-z”开关运行 nc,结果相同。 这些机器被放置在我们的生产中,所以我不允许安装任何第三方应用程序,如 nmap。

Platform: Mac OS X 10.8.4
Executable: /usr/bin/nc

对不起,如果这个问题已经得到解答,我搜索了但找不到任何解决方案。

【问题讨论】:

  • 我认为 Mac 上的 nc 存在错误。我有优胜美地。当我在 Linux 上比较相同的命令以进行 DNS 代理时,Linux 会一遍又一遍地返回响应。在 Mac 上,它返回第一个响应然后卡住,因为我认为它没有看到传输结束。使用mkfifo /tmp/fifo; nc -lu 127.0.0.1 53 < /tmp/fifo | nc -u 8.8.4.4 53 > /tmp/fifo 亲自查看,然后在另一个终端窗口中,多次执行nslookup example.com 127.0.0.1

标签: bash networking osx-mountain-lion sshd netcat


【解决方案1】:

我在运行 10.8.4 的 Mac 上尝试了这个,大约 6 分钟后它看起来像:

andys-MacBook-Pro:EquipDB uw$ for i in {183..200}; do echo "hello" | nc -n -w 2 -v 10.120.113.$i 22; done
nc: connect to 10.120.113.183 port 22 (tcp) failed: Operation timed out
nc: connect to 10.120.113.184 port 22 (tcp) failed: Operation timed out
nc: connect to 10.120.113.185 port 22 (tcp) failed: Operation timed out
nc: connect to 10.120.113.185 port 22 (tcp) failed: Operation timed out

所以我的超时了,但需要相当长的时间。

嗯...我认为我的测试毫无意义,因为我永远不会真正连接到某些东西,因为我不在您的网络上。但我确实看到了:

-w # => # 秒后超时

请注意,-w 还设置网络不活动超时。这在标准输入关闭之前没有任何影响,但是如果在接下来的几秒钟内没有任何进一步的来自网络的到达,netcat 会尝试再次读取网络以进行良好的测量,然后关闭并退出。现在有很多网络服务接受少量输入并返回大量输出,例如 Gopher 和 Web 服务器,这就是 netcat 被写入“阻止”网络保持开放而不是保持开放的主要原因。比标准输入。以这种方式处理超时可以与网络服务器提供统一的行为,这些服务器在被告知之前不会自行关闭

这适用于最终的网络读取,但不适用于连接。

如果我理解这一点,它只会在连接后超时,因为我从不连接它只是有一个与 -w 无关的内置超时? 找到here,有帮助吗?

【讨论】:

  • 感谢您的回复。我注意到同样的事情,nc 似乎在 aprox 之后超时。 90 秒。我想现在的问题是是否有任何方法可以强制 nc 超时。
  • 决定在检查打开的端口/服务版本之前编写一个小脚本来更新我的客户端上的 arp 缓存,这将为我提供使用的 IP 地址列表。除此之外,我将推出自定义启动脚本的更新版本,以防止用户通过系统偏好设置禁用 sshd。这应该可以防止 nc 连接到不存在的 IP 地址和关闭 sshd 的客户端。我知道它实际上并不能解决问题,但我非常感谢您的反馈,感谢 Beartech!
【解决方案2】:

我相信您正在寻找-G 选项。从手册页:

-G conntimeout TCP 连接超时(以秒为单位)。

-w 用于设置超时之后 连接。 -G 选项用于设置超时before 连接。这应该会给你你想要的

nc -n -G 2 -v xxx.xxx.xxx.xxx 22

【讨论】:

    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2013-08-12
    • 2013-06-30
    相关资源
    最近更新 更多