web-dev-qa-db-ja.com

サーバーが到達可能かどうかを確認するシェルスクリプト?

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

そこで、Bash Shellスクリプトを記述して、到達可能かどうかを確認したいと思います。私が試したのは:

ssh ipaddress "uname -a"

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

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

ping -c4 $ip_addressを使用できます。ここで$ip_addressはリモートサーバーのIPで、出力を解析して成功したパケットや失敗したパケットをキャプチャし、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-pagepingを確認しました。 Solarisボックスのpingからの出力は異なります。また、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]
                           ^           ^
                           |           |
---------------------------------------  

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

6
jaypal singh

Sshコマンドは、サーバーが到達可能である場合以上のテストを行います-サーバーが機能するためには、sshサーバーが実行されていて、認証が正しく行われている必要があります。

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

ping -c1 -W1 $ip_addr && echo 'server is up' || echo 'server is down'
26
gcbenison

実行できる最も重要なチェックは、おそらくnetcatを使用して開いているポートをチェックすることです。

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

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

マンページから:

-z ncがリスニングデーモンをスキャンし、データを送信しないことを指定します。

25
flying sheep

これらのオプションは、pingのmanページから使用できます。

  • 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
6
Katie

考えるためのもう少し食べ物: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
1
Mike Q

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

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

$ ip_addrはIPの最初の番号を削除するため使用できません。

0
rocket singh

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

0
Ivo Varbanov