2013-08-08 11 views
44

スクリプトを書くと、ネットワーク上のデバイス(一日中オンラインになるはずのデバイス)が本当にオンラインになっているかどうかを確認できます。私はPINGを使用しようとしましたが、私は有効か無効かIPアドレスを入力すると bashスクリプトでpingを使用してホストの可用性を確認する

if [ "`ping -c 1 some_ip_here`" ] 
then 
    echo 1 
else 
    echo 0 
fi 

は関係なく 1与えます。特定のアドレス(またはIPアドレスのリストのいずれかのデバイス)がオフラインになったかどうかを確認するにはどうすればよいですか?

+0

あなたはnmap'、それはあなたがIPアドレスの範囲を指定することができます '使用することを検討すべきです。 – devnull

+0

FWIW、あなたのスニペットは私のためにうまく動作します。 –

+0

質問に答えられませんが、 "ping -c 1 some_ip_here"の代わりに "$(ping -c 1 some_ip_here)"を使用する方がよいでしょう。 [詳細については、このリンクを参照してください](http://stackoverflow.com/a/9449788/1547699) – Anubis

答えて

37

Pingは、エラーの種類によって異なる終了コードを返します。

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手段が到達可能

2をホストあなたはif文でバッククォートを必要としない、到達不能

+0

cool ...私はまだスクリプトに新しく、私のコードで 'if'が終了コードをチェックすると思っています。 .. – burtek

+2

ifは、0以外の終了コード(すべてのエラー)で 'echo 1'ブロックを起動します。しかし、どのような種類のエラーが発生したかを把握するには、正確な終了コードを確認してください。 – StianE

+0

最初に '68'を得ますか?私は '2'を取得し、ホストを知らない。 3番目の例でDestination Host Unreachableを使って '1'を取得します。 – nephewtom

38

を意味します。このチェックを使用できます

if ping -c 1 some_ip_here &> /dev/null 
then 
    echo 1 
else 
    echo 0 
fi 

ifコマンドは、次のコマンド(ping)の終了コードをチェックします。終了コードが0の場合(コマンドが正常に終了したことを意味します)、thenブロックが実行されます。ゼロ以外の終了コードを返すと、elseブロックが実行されます。

15

pingの高度なバージョン - "fping"があり、タイムアウトをミリ秒単位で定義できます。

#!/bin/bash 
IP='192.168.1.1' 
fping -c1 -t300 $IP 2>/dev/null 1>/dev/null 
if [ "$?" = 0 ] 
then 
    echo "Host found" 
else 
    echo "Host not found" 
fi 
+0

'ping'にはタイムアウトを定義できる-tオプションもあります。 –

+6

真。しかし、数秒で。 'fping' - ミリ秒単位で、pingするホストがたくさんある場合は重要です。 –

+0

"Unixy" pingでは-tはタイムアウトではなく、TTLです。タイムアウトは-Wで指定します。注:これは長い間ブロックされている可能性があります。 DNSサーバーがなくなり、DNS名を解決する必要がある場合最近の攻撃を念頭に置いて、これを考慮する必要があります。 – dom0

3

FYI、 は、私はちょうどマルチピングの上に、私たちが使用している場合の方法を使用していくつかのテスト(10のリクエスト)

のping-C10 8.8.8.8 &>を/ dev/nullをしました。エコー$?

マルチpingコマンドの結果は、すべてのping要求が到達不能である場合に到達可能ピング結果の少なくとも一方、 場合は「0」と「1」になります。

7

私はどちらの場合には何をすべきかとエコーコマンドを置き換える、IPまたはホスト名を127.0.0.1に置き換え

ping -c 1 127.0.0.1 &> /dev/null && echo success || echo fail 

を実行するには、このような1つのライナーと考え​​ることができます。

上記のコードは成功しますが、アクセスできないIPアドレスまたはホスト名で試してみることもできます。このよう

ping -c 1 google.com &> /dev/null && echo success || echo fail 

この

ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail 
1
up=`fping -r 1 $1 ` 
if [ -z "${up}" ]; then 
    printf "Host $1 not responding to ping \n" 
    else 
    printf "Host $1 responding to ping \n" 
fi 
関連する問題