web-dev-qa-db-ja.com

bashスクリプトでpingを使用してホストの可用性を確認する

ネットワーク内のデバイスのうち、1日中オンラインになっているはずのデバイスが実際にオンラインであるかどうかをチェックし続けるスクリプトを作成します。私はpingを使用しようとしましたが、

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

有効なIPアドレスまたは無効なIPアドレスを入力しても、1が表示されます。特定のアドレス(またはIPアドレスのリストにある任意のデバイス)がオフラインになったかどうかを確認するにはどうすればよいですか?

59
burtek

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は到達不能を意味します

57
StianE

Ifステートメントにバックティックは必要ありません。このチェックを使用できます

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

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

49
user000001

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
21
Fedir RYKHTIK

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

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

127.0.0.1をIPまたはホスト名に置き換え、echoコマンドをどちらの場合でも実行する必要があるものに置き換えます。

上記のコードは成功します。アクセスできないIPまたはホスト名を試してみてください。

このような:

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

この

ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail
14
sdkks

参考までに、上記の方法を使用してテストを行いました。マルチpingを使用する場合(10リクエスト)

ping -c10 8.8.8.8&>/dev/null;エコー$?

マルチpingコマンドの結果は、pingの結果の少なくとも1つが到達可能な場合は「0」になり、すべてのping要求に到達できない場合は「1」になります。

3
emirjonb
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
2
miltos