netcat超时问题

and*_*sme 12 bash netcat

如果尝试连接的时间超过3秒(即:端口未打开时),为什么以下netcat命令不会超时?我假设-w标志将是我需要的.OS是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"

CDa*_*ahn 24

您需要重定向到/ dev/null,而不是管道.请尝试以下方法:

nc -v -z -w 3 127.0.0.1 5050 &> /dev/null && echo "Online" || echo "Offline"
Run Code Online (Sandbox Code Playgroud)

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

$ nc -v -z -w 3 localhost 5050 &> /dev/null && echo "Online" || echo "Offline"
Offline
Run Code Online (Sandbox Code Playgroud)

  • 感谢那!出于好奇,为什么重定向时需要 & ? (2认同)
  • nc将详细输出转储到stderr,因此如果您只想查看"在线"和"离线",则需要使用&>告诉bash将stdout和stderr重定向到/ dev/null.如果你摆脱了-v,你可以说nc -z -w 3 localhost 5050 && echo"Online"|| 回声"离线" (2认同)

小智 10

从 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

这是每个端口扫描一秒钟 - 更有用。


Mik*_*e Q 7

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

nc -v -z -w 3 127.0.0.1 22 &> /dev/null && echo "Online" || echo "Offline"
Run Code Online (Sandbox Code Playgroud)

Mac OSX:

nc -z -G 3 127.0.0.1 22  &> /dev/null && echo "Online" || echo "Offline"
Run Code Online (Sandbox Code Playgroud)

替代解决方法选项:

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
Run Code Online (Sandbox Code Playgroud)

(示例说明通过一个好的和坏的主机示例连接到端口 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
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

apt-get install netcat-openbsd
Run Code Online (Sandbox Code Playgroud)

  • 我在macOS 10.13.4上的nc遇到了这个问题。使用Homebrew固定安装(gnu)netcat ... (2认同)