28

さまざまな場所に5台のSolarisサーバーがあります。これらのサーバーの一部は、さまざまな理由(ネットワークの問題またはサーバー自体が突然ダウンしたため)により、私の場所から到達できない場合があります。

そこで、Bashシェルスクリプトを作成して、到達可能かどうかを確認したいと思います。私が試したことは:

ssh ipaddress "uname -a"

パスワードレス認証が設定されています。出力がない場合は、メールを生成します。

  1. サーバーの到達可能性をチェックする他の方法はありますか?
  2. どちらが最善の方法ですか?
  3. 私が試したことは正しいですか?
4

7 に答える 7

53

実行できる最も基本的なチェックは、おそらくnetcat開いているポートをチェックするために使用することです。

SSH(ポート22)の到達可能性を確認するには、次のようにします。

if nc -z $server 22 2>/dev/null; then
    echo "$server ✓"
else
    echo "$server ✗"
fi

マンページから:

-z   ncが、データを送信せずに、リスニングデーモンをスキャンするだけでよいことを指定します。

于 2015-12-18T14:53:54.347 に答える
33

sshコマンドは、サーバーが到達可能かどうか以上のテストを行います。サーバーが機能するには、sshサーバーが実行されている必要があり、すべてが認証されている必要があります。

サーバーが稼働しているかどうかを確認するには、単純なpingを実行するのはどうでしょうか。

ping -c1 -W1 $ip_addr && echo 'server is up' || echo 'server is down'
于 2012-01-20T06:44:53.743 に答える
11

pingのマニュアルページから次のオプションを使用できます。

  • 1つのパケット( "c1")のみを送信します。
  • クワイエットモード( "q")、
  • (オプション)応答を1秒間待ちます( "W1")

    ping -c1 -W1 -q $server

Pingは、エラーの種類に応じて異なる終了コードを返します。したがって、機能するかどうかをテストするには、「echo $?」を実行します。終了コードを取得します。このような:

ping 256.256.256.256 ; echo $?
# 68

ping -c 1 127.0.0.1 ; echo $?
# 0

ping -c 1 192.168.1.5 ; echo $?
# 2

どこ

0 means host reachable
>0 means unreachable

したがって、これをbashスクリプトでテストするには、次のようにします。

ping -c1 -W1 -q $server &>/dev/null
status=$( echo $? )
if [[ $status == 0 ]] ; then
     #Connection success!
else
     #Connection failure
fi
于 2015-11-03T18:51:02.603 に答える
7

考えるべきもう少しの食べ物:nmapまたはncを使用し、pingはしないでください。

ping:なぜpingを使用しないのですか?(1)システムとポートを同時にチェックすることをお勧めします。(2)icmpエコーは多くの状況でブロックされるため、Pingは信頼できません。

Nmap:これは非常に高速で信頼性がありますが、nmapをインストールする必要があります。推奨される方法NMAP(ex host ip 127.0.0.1):

nmap 127.0.0.1 -PN -p ssh | grep open

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
于 2019-05-09T15:29:18.097 に答える
5

ping -c4 $ip_addressリモートサーバーのIPがどこにあるかを使用$ip_addressし、出力を解析して成功したパケットや失敗したパケットをキャプチャし、を使用mail -sしてログを電子メールで送信できます。

これがあなたが始めるための何かであり、あなたはそれに基づいて構築することができます。

ping -c4 www.google.com | awk '/---/,0'

これにより、次のような出力が得られます-

[jaypal:~/Temp] ping -c4 www.google.com | awk '/---/,0'
--- www.l.google.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 36.638/36.870/37.159/0.196 ms

Solarisをチェックしman-pageましたpingpingSolarisボックスからの出力が異なります。また、Linuxでは、パケットの数を指定してパケットを制限し-cます。Solarisでは、次のことを行う必要があります-

ping -s www.google.com 2 4

/usr/sbin/ping -s [-l | -U] [-adlLnrRv] [-A addr_family]
[-c traffic_class] [-g gateway [ -g gateway...]] [-
F flow_label] [-I interval] [-i interface] [-P tos] [-
p port] [-t ttl] host [data_size] [npackets]
                           ^           ^
                           |           |
---------------------------------------  

残念ながら、私はあなたを助けるのに便利なソラリスボックスを持っていません。

于 2012-01-20T06:51:17.097 に答える
5

の代わりにでnc -z -G 2 SERVER_HOST PORTアプローチを使用できます。接続が確立される前のタイムアウトに使用されるため、ホストに到達できない場合は、より速く知ることができますGWG

于 2018-11-02T15:26:29.663 に答える
0

以下のコマンドを使用できます、

ping -c1 -W1 ip_addr || echo 'server is down'  

$ ip_addrを使用すると、IPの最初の番号が削除されるため使用できません。

于 2014-02-12T10:07:32.490 に答える