【问题标题】:Issue with netcat timeoutnetcat 超时问题
【发布时间】:2014-06-13 05:42:28
【问题描述】:

如果尝试连接时间超过 3 秒(即:端口未打开时),为什么以下 netcat 命令不会超时?我认为 -w 标志将是我所需要的。操作系统是 OSX 10.9。

nc -v -z -w 3 127.0.0.1 5050

假设可行,我计划像这样实现(不确定这是否可行,总 bash noob)

nc -v -z -w 3 127.0.0.1 5050 | /dev/null && echo "Online" || echo "Offline"

【问题讨论】:

  • 当我尝试它时,我立即收到错误响应,因为端口未打开。你确定它没有在你的主机上打开吗?如果是,那么这就是它没有超时的原因,因为它实际上已连接。
  • 很奇怪,它似乎只发生在特定端口上......我试图使用它来监控特定服务是否从远程位置或网络在我的机器上运行。该服务当前未运行,但 netcat 似乎没有超时,进程只是挂起。有什么想法吗?
  • 您是否正在运行任何类型的防火墙? “iptables -L”向你展示了什么?
  • 我正在使用 OSX 并且我的防火墙已关闭。它明确指出“允许与此计算机的所有连接”。 OSX 中没有原生的 'iptables' 命令。
  • netcat 在不同平台上的行为显然不同 (philandstuff.com/2013/05/17/statsd-netcat.html)。我在linux上。您可以在运行此命令的同时运行 tcpdump 以查看是否正在发生预期的行为吗?

标签: bash netcat


【解决方案1】:

您需要重定向到 /dev/null,而不是通过管道连接到它。请尝试以下操作:

nc -v -z -w 3 127.0.0.1 5050 &> /dev/null && echo "Online" || echo "Offline"

在我的机器上,端口 5050 未打开,我得到以下信息:

$ nc -v -z -w 3 localhost 5050 &> /dev/null && echo "Online" || echo "Offline"
Offline

【讨论】:

  • 谢谢!出于好奇,为什么重定向时需要 &?
  • nc 将详细输出转储到 stderr,因此如果您只想查看“在线”和“离线”,则需要使用 &> 告诉 bash 将 stdout 和 stderr 都重定向到 /开发/空。如果你去掉 -v,你可以说 nc -z -w 3 localhost 5050 && echo "Online" || echo "离线"
【解决方案2】:

自 Mac OS X 10.8.x 起,nc 已使用 -G 选项来设置启动连接的超时时间。这与 -w 选项不同,后者为已建立但已空闲的连接设置超时。

如果您尝试使用nc 进行端口扫描,即nc -v -z 10.0.1.1 1-1023,除非您添加-G 超时值,否则它将花费超过一分钟的时间尝试连接到每个无响应的端口:

nc -v -z -G 1 10.0.1.1 1-1023

每个端口扫描一秒钟——更有用。

【讨论】:

    【解决方案3】:

    Nc: nc 通常已安装,但是在某些系统(例如 Mac OS X)上,如果没有 -G 选项,该命令会在无法访问的系统上挂起。如果这不起作用,请使用解决方法。

    nc -v -z -w 3 127.0.0.1 22 &> /dev/null && echo "Online" || echo "Offline"
    

    Mac OSX:

    nc -z -G 3 127.0.0.1 22  &> /dev/null && echo "Online" || echo "Offline"
    

    替代解决方法选项:

    bash -c '(sleep 3; kill $$) & exec nc -z 127.0.0.1 22' &> /dev/null
    echo $?
    0
    bash -c '(sleep 3; kill $$) & exec nc -z 1.2.3.4 22' &> /dev/null
    echo $?
    143
    

    (示例说明通过一个好的和坏的主机连接到端口 22 的 ssh 示例,使用 $? 来确定它是否到达休眠时间为 3 秒的主机)

    或者对于 Mac 用户(主要)等,您可以像这样在脚本中使用命令:

        # -- use NMAP, if not avail. go with nc --
        if command -v nmap | grep -iq nmap ; then
            nmap ${ip} -PN -p ${ssh_port} | grep -iq "open"
            res=$?
        elif command -v nc | grep -iq nc ; then
            # -- run command if fails to complete in 3 secs assume host unreachable --
            ( nc -z ${ip} ${ssh_port} ) & pid=$!
            ( sleep 3 && kill -HUP $pid ) 2>/dev/null & watcher=$!
            if wait $pid 2>/dev/null; then
                pkill -HUP -P $watcher
                wait $watcher
                # -- command finished (we have connection) --
                res=0
            else
                # -- command failed (no connection) --
                res=1
            fi
        else
            echo "Error: You must have NC or NMAP installed"
        fi
    
        if [[ ${res} -lt 1 ]] ;then
            success=1
            echo "testing  => $ip SUCCESS connection over port ${ssh_port}"
            break;
        else
            echo "testing => $ip FAILED connection over port ${ssh_port}"
        fi
    

    【讨论】:

    • 在 Mac 上只需使用 -G 选项。 nc -z -G 3 127.0.0.1 22
    • 我有幸使用timeout commandtimeout 1 nc ...
    • @Fred.W 我认为你对 mac 的 -G 很好,你应该不需要其他任何东西,你想解决什么问题?
    • 跨平台支持mac和linux
    【解决方案4】:

    在 debian (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=97583) 上有一个关于此的旧错误报告,但在 Debian GNU/Linux 7.7 (wheezy) 中仍然具有相同的行为

    我找到了一个“解决方案”:安装openbsd版本的nc:

    apt-get install netcat-openbsd
    

    【讨论】:

    • 我在 macOS 10.13.4 上遇到了 nc 问题。使用 Homebrew 安装(gnu)netcat 修复了它...
    • 该错误已在 2001 年修复,因此 Debian 3.0 (Woody) 及更高版本不应该遭受它。正如接受的答案中所述,问题的问题与语法相关(nc … |/dev/null 不起作用,因为/dev/null 不可执行,nc … >/dev/null 工作正常)。也就是说,该修复程序专门应用于 Debian,上游 netcat 仍然可能有它(当前 Debian 使用 netcat 1.10-41.1,修复程序是 1.10-18,破折号指的是 Debian 构建,使用补丁修改上游版本) ,所以我可以理解 OS X 仍然存在这个问题。
    【解决方案5】:

    在 Mac OS X (10.14.6) 上,-w 3 参数以某种方式被忽略。

    我找到的解决方法是:timeout 3 nc -vz 10.18.50.134 23

    【讨论】:

    • -w 用于设置连接后的超时时间。 -G 选项用于设置连接前的超时时间。对于 macOS 用户来说,这是一个更好的解决方法:nc -G 3 xxx.xxx.xxx.xxx 5050 来源:stackoverflow.com/a/35141831/5972142
    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2011-06-19
    • 1970-01-01
    • 2011-04-03
    • 2011-12-28
    • 2013-07-12
    相关资源
    最近更新 更多