web-dev-qa-db-ja.com

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"

12
anditpainsme

パイプするのではなく、/ 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
22
CDahn

これに関する古いバグレポートがdebian( https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=9758 )にあり、Debian GNU /でも同じ動作をしますLinux 7.7(wheezy)

私はこれに対する「解決策」を見つけました:ncのopenbsdバージョンのインストール:

apt-get install netcat-openbsd
5
Thiago Ruiz

Mac OS X 10.8.x以降、nc-Gオプションを使用して、接続を開始するためのタイムアウトを設定しています。これは、作成されたがアイドル状態になった接続のタイムアウトを設定する-wオプションとは異なります。

ポートスキャンにncを使用しようとしている場合、つまりnc -v -z 10.0.1.1 1-1023の場合、-Gタイムアウト値を追加しない限り、応答しない各ポートへの接続に1分以上かかります。

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

これは、スキャンされるポートごとに1秒です。はるかに便利です。

0
MacTroy

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ユーザー(主に)などの場合、スクリプトで次のようにコマンドを使用できます。

    # -- 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
0
Mike Q

Mac OS X(10.14.6)では-w 3パラメータはどういうわけか無視されます。

私が見つけた回避策は:timeout 3 nc -vz 10.18.50.134 23