web-dev-qa-db-ja.com

スクリプトでpingを使用する方法

次のようなbashスクリプトが必要です。

for c in computers:
do
   ping $c
   if ping is sucessfull:
      ssh $c 'check something'
done

sshのみを実行し、コンピューターが応答しない場合、タイムアウトには永久に時間がかかります。そこで、pingの出力を使用して、コンピューターが稼働しているかどうかを確認することを考えていました。それ、どうやったら出来るの?他のアイデアも素晴らしいでしょう

10
Guy

ping の戻り値を使用します:

for C in computers; do
  ping -q -c 1 $C && ssh $C 'check something'
done

pingは、その単一のping(-c 1)が成功した場合、値0で終了します。 pingタイムアウト時、または$Cを解決できない場合は、ゼロ以外の値で終了します。

16
Stephan202

pingコマンドで-wスイッチ(またはFreeBSDおよびOSXでは-t)を使用してから、コマンドの戻り値を調べます。

ping -w 1 $c
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
    ssh $c 'check something'
fi

接続しているホストが遠く、待ち時間が長い場合は、-wで渡すパラメーターを調整することをお勧めします。

man pingから:

   -w deadline
          Specify  a  timeout, in seconds, before ping exits regardless of
          how many packets have been sent or received. In this  case  ping
          does  not  stop after count packet are sent, it waits either for
          deadline expire or until count probes are answered or  for  some
          error notification from network.
8
Mike Mazur

すべてのネットワーク環境でpingの実行が許可されているわけではなく(多くの場合は許可されています)、すべてのホストがping要求に応答するわけではありません。 pingを使用せず、代わりにsshの接続タイムアウトを設定することをお勧めします。

コンピューターのcの場合; do 
 ssh -o ConnectTimeout = 2 $ c '何かをチェック' 
 done 
4
kkeller

これが私のハックです:

#ipaddress Shell variable can be provided as an argument to the script.
while true
do
   nmap_output=$(nmap -p22 ${ipaddress})
   $(echo ${nmap_output} | grep -q open)
   grep_output=$?
   if [ "$grep_output" == 0 ] ; then
       #Device is LIVE and has SSH port open for clients to connect
       break
   else
       #[01 : bold
       #31m : red color
       #0m : undo text formatting
       echo -en "Device is \e[01;31mdead\e[0m right now .... !\r"
   fi
done
#\033[K : clear the text for the new line
#32 : green color
echo -e "\033[KDevice is \e[01;32mlive\e[0m !"
ssh user@${ipaddress}

pingだけに依存しません。どうして ?
-成功したpingは、成功したsshアクセスを保証するものではありません。このスクリプトの先頭にping testを追加して、pingが失敗した場合に終了し、上記から何もしないこともできます。

上記のbashスクリプトスニペットは、アクセスしようとしているデバイスで、クライアント(ユーザー)が接続できるSSHポートが開いているかどうかを確認します。 nmapパッケージをインストールする必要があります。

そのスクリプトで複数のコンピューターにsshしたい理由がわかりません。しかし、私のものはsshで1つのデバイスに機能し、ニーズに合わせて変更できます。

0
smRaj

測定ツールとして64の値を使用することは論理的ではありません。代わりに、受信/紛失したパケットの数を使用することをお勧めします。

このスクリプトは機能します:

RESULT="1"
PING=$(ping ADDRESS -c 1 | grep -E -o '[0-9]+ received' | cut -f1 -d' ')
if [ "$RESULT" != "$PING" ]
then
    DO SOMETHING
else
    DO SOMETHING
fi
0
Hatef

私はそのスクリプトを約10年前に書きました。

http://www.win.tue.nl/~rp/bin/rshall

到達可能なすべてのホストを決定し、それぞれを反復処理する部分はおそらく必要ありません。

0
reinierpost

Bashを参照した元の質問を認めて、これを Fish Shellで達成しようとしている人のための例を次に示します。

ping -q -c 1 bogus.local; and echo "pinging the Host worked"; or echo "pinging the Host didn't work"
0
Paul Wenzel