海馬のかわり

最近記憶力に難がある、地方在住サーバエンジニアの備忘録です。

スクリプト小ネタ(rrping)

WindowsでいうところのExPingみたいな複数ホストへのPingツールが欲しかったので、見かけだけそれっぽいツールを作ってみた。
使い方は引数にIPアドレスもしくは名前を付けて実行、「Ctr+C」で終了。

$ chmod u+x rrping.sh
$ ./rrping.sh 192.168.0.1 172.16.0.1 10.0.0.1


bashのブレース展開を使ったり、teeログに落としたり。

$ ./rrping.sh 192.168.0.{1,2,3,4,5} | tee hoga.log


IPアドレスを羅列したリストを読み込む

$ cat iplist.txt
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
$ 
$ cat iplist.txt | xargs ./rrping.sh


rrping.sh

#!/bin/bash

# rrping.sh - Round Robin ping tool -
#
# Usage) ./rrping.sh ipaddr1 ipaddr2 ipaddr3 ...even more
#        ./rrping.sh 10.0.0.{1,2,3,4,5}
#

# ARGS
## Number of ping execution
count=1
## Unknown Host timeout (Sec)
timeout=1
## Interval time (Sec)
interval=0.5

# PING Status Color
## Green
ok_color=32
## Red
ng_color=31

ip_array=($@)

echo "Status/Date/Name/IPaddr/Time"
while :;do
 for (( i = 0; i < ${#ip_array[@]}; ++i ))
  do
   date=`date "+%Y/%m/%d %T"`
   ping=`/bin/ping -c $count -W $timeout ${ip_array[$i]} | grep ttl= 2>/dev/null`
   if [ -n "$ping" ]; then
        #echo -n "[OK] "
        echo -en "\033[1;${ok_color}m[OK] \033[0m"

        name_check=`echo $ping | grep \(`
        if [ -n "$name_check" ]; then
            result=(`echo $ping | awk '{print $5,$8}'`)
            echo "$date ${ip_array[$i]}: ${result[0]} ${result[1]} ms"
        else
            result=(`echo $ping | awk '{print $4,$7}'`)
            echo "$date ${ip_array[$i]}: ${result[0]} ${result[1]} ms"
        fi
   else
        #echo -n "[NG] "
        echo -en "\033[1;${ng_color}m[OK] \033[0m"
        echo "$date ${ip_array[$i]}: failed to ping."
   fi
   sleep $interval
  done
done

以上