5つのSolarisサーバーがさまざまな場所に存在しています。時々、これらのサーバーのいくつかは、さまざまな理由(ネットワークの問題またはサーバー自体が突然ダウンしたため)のために私の場所から到達できない場合があります。
そこで、Bash Shellスクリプトを記述して、到達可能かどうかを確認したいと思います。私が試したのは:
ssh ipaddress "uname -a"
パスワードレス認証が設定されています。出力がない場合は、メールを生成します。
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-page
でping
を確認しました。 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]
^ ^
| |
---------------------------------------
残念ながら私はあなたを手助けするのに便利なソラリスボックスを持っていません。
Sshコマンドは、サーバーが到達可能である場合以上のテストを行います-サーバーが機能するためには、sshサーバーが実行されていて、認証が正しく行われている必要があります。
サーバーが稼働しているかどうかを確認するには、単純なpingだけではどうでしょうか。
ping -c1 -W1 $ip_addr && echo 'server is up' || echo 'server is down'
実行できる最も重要なチェックは、おそらくnetcat
を使用して開いているポートをチェックすることです。
sSH(ポート22)の到達可能性を確認するには、次のようにします。
if nc -z $server 22 2>/dev/null; then
echo "$server ✓"
else
echo "$server ✗"
fi
マンページから:
-z
ncがリスニングデーモンをスキャンし、データを送信しないことを指定します。
これらのオプションは、pingのmanページから使用できます。
(オプション)応答を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
考えるためのもう少し食べ物: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
以下のコマンドを使用できます
ping -c1 -W1 ip_addr || echo 'server is down'
$ ip_addrはIPの最初の番号を削除するため使用できません。
nc -z -G 2 SERVER_Host PORT
G
の代わりにW
を使用してアプローチします。 G
は、接続が確立される前のタイムアウトに使用されているため、ホストに到達できない場合は、より速く知ることができます