文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>一个ping的脚本

一个ping的脚本

时间:2009-03-29  来源:从未被和谐

可以ping一段连续的ip地址也可以从文件中读取ip地址

并发执行

按照ping的顺序,对结果进行分类排序

#!/bin/sh
trap 'echo "before execute line:$LINENO" >/dev/null' DEBUG
d_buffer=/tmp/ipbuffer
declare -a IP # ip list
test() # test start end
{
        local lsip=$1
 local leip=$2
 local t=0
        echo "testting....."
        while [ $lsip -le $leip ]
        do
        (
                ping -c 1 -w 1 ${IP[$lsip]} >/dev/null 2>&1
                te=`echo $?`
                if [ $te -gt "0" ]
                then
   echo "${IP[$lsip]} lost"> $d_buffer/lost$t.buf
                else
   echo "${IP[$lsip]} ok"> $d_buffer/on$t.buf
                fi
        )&
                ((lsip++))
  ((t++))
        done
        wait
 for ((a=0;a<t;a++))
 do
  if [ -e $d_buffer/on$a.buf ]
  then
   cat $d_buffer/on$a.buf>>error
  fi
 done
 for ((b=0;b<t;b++))
 do
  if [ -e $d_buffer/lost$b.buf ]
  then
   cat $d_buffer/lost$b.buf>>error
  fi
 done
}

:>./error  #Çå¿ÕerrorÎļþ
case $1 in
"-h"|"--help"|"")
        echo -e "Usage:atping [-r] ip_start ip_end\natping 192.168.0.1 192.168.0.254#ping 192.168.0.1-192.168.0.254"
 echo "atping -r                          #read ip from ip.txt "
        ;;
[1-2]*)
 if [ ! -d $d_buffer ]
 then
  mkdir $d_buffer
 fi
 rm /tmp/ipbuffer/* 2&>/dev/null
 startip=$1
 endip=$2
 declare -r sip=${startip##*.}             #  *.*.*.10
 eip=${endip##*.}                         
 ct=$((${endip##*.}-${startip##*.}))       #  *.*.*.10-*.*.*.5
 for ((i=sip;i<=eip;i++))
 do
  IP[$i]=${startip%.*}.$i           #10.10.10.*+10
 
 done
        test $sip $eip
        exist=$(grep "ok" error|wc -l)
        lost=$(grep "lost" error|wc -l)
 cat error
        echo -e "total:$ct\nexist:$exist .lost:$lost"
        ;;

-r)
        IP=($(cat ip.txt))  
        count=`cat ip.txt|wc -l` 
        test 0 $count
        exist=$(grep "ok" error|wc -l)
        lost=$(grep "lost" error|wc -l)
        echo -e "total:$count\nexist:$exist.lost:$lost"
        ;;
*) echo "wrong parameter"
        exit
esac

关于其中字符串操作的方法:

${string#substring}:从$string左边开始,剥去最短匹配$substring子串.

${string##substring}:从$string左边开始,剥去最长匹配$substring子串.

${string%substring}:从$string结尾开始,剥去最短匹配$substring子串。

${string%%substring}:从$string结尾开始,剥去最长匹配$substring子串。

比如addr=192.168.0.234

${addr#*.}  #去掉左边第一个.和其左边的*(任意字符)结果:168.0.234

${addr##*.} #去掉右边第一个.和其左边的*(任意字符)结:234

${addr%.*}  #去掉右边第一个.和其右边的*(任意字符)结果:192.168.0

${addr%%.*} #去掉左边第一个.和其右边的*(任意字符)结果:192

详细请参看ABS的第9.2章操作字符串中相关内容。

里边还涉及到一些并发的部分,本来打算用mkfifo做,后来发现不能实现我的功能,相关讨论在http://bbs2.chinaunix.net/viewthread.php?tid=1351218&extra=&page=1

后来我发现,这个脚本要在子进程之间传递消息,而不是由子进程向父进程传递消息,还没有找到用fifo实现的方法,最后偷了个懒,把消息都写到文本文件当当中,再由父进程对结果进行统计。还请高人指点在进程间传递消息既然普通文本文件也可以,那用mkfifo与普通文件有什么不同吗?

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载