netcat超时问题

时间:2014-06-13 05:42:28

标签: bash netcat

如果尝试连接的时间超过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"

5 个答案:

答案 0 :(得分:22)

您需要重定向到/ 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

答案 1 :(得分:5)

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

我找到了一个"解决方案"对此:安装openbsd版本的nc:

apt-get install netcat-openbsd

答案 2 :(得分:1)

自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 :(得分:0)

Nc:通常已经安装了nc,但是在某些系统(例如Mac OS X)上,该命令挂在无法访问的系统上。 (请参阅解决方法)

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

Mac OSX解决方法:

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用户(主要是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

答案 4 :(得分:0)

在Mac OS X(10.14.6)上,-w 3参数被忽略了。

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