批量ping-网段版
说明
shell脚本,适用于Linux操作系统中多个网段ping测。目前只能测试24位的网段。该脚本执行前需要操作系统已经具备timeout、ping命令。每个IP地址ping超时设置为2秒,脚本分为两个版本,基础版一个C分成4个段同时进行ping测;高级版可以自定义把一个C分成多个段同时ping,分的段越多ping测速度越快。
文件说明
- network.list:待ping测网段文件。
- result.log:ping测结果输出文件。
- ping_ce.sh:ping测试脚本主体文件,基础版。
- ping_ce_adv.sh:ping测试脚本主体文件,高级版。
配置文件格式
待ping测网段文件格式如下,参考图片进行内容编写即可。
图 1
结果文件格式
结果文件是脚本自动生成的,不用手动创建,结果格式如下。
图 2
脚本
基础版脚本
ping_ce.sh 循环读取network_file文件中的网段信息,把读取到的网段信息依次代入到ping测函数中进行,结果汇总到result_log中。把一个网段分成4个段,每个段单独起一个函数用来ping测。每个IP地址ping测超时时间为2秒,就是说ping一个网段最长时间为 64(一个段ip地址数)*2(每个IP最长ping超时)秒=128秒。一个网段ping测最长耗时2分钟。该脚本文件3分钟之内只能执行一次,3分钟内两次及以上次执行会造成反馈结果异常。
#!/bin/bash #指定需要使用的网段文件位置;指定生成的日志文件存放位置。 network_file="network.list" result_log="result.log" #进行1-128地址的ping read_file_ping_1(){ for i in `seq 1 64` do timeout 2 ping -c 1 $1$i &>/dev/null if [ $? -eq 0 ];then echo "$1$i success" >> $result_log else echo "$1$i faile" >> $result_log fi done } #进行65-128地址的ping read_file_ping_2(){ for i in `seq 65 128` do timeout 2 ping -c 1 $1$i &>/dev/null if [ $? -eq 0 ];then echo "$1$i success" >> $result_log else echo "$1$i faile" >> $result_log fi done } #进行129-192地址的ping read_file_ping_3(){ for i in `seq 129 192` do timeout 2 ping -c 1 $1$i &>/dev/null if [ $? -eq 0 ];then echo "$1$i success" >> $result_log else echo "$1$i faile" >> $result_log fi done } #进行193-254地址的ping read_file_ping_4(){ for i in `seq 193 254` do timeout 2 ping -c 1 $1$i &>/dev/null if [ $? -eq 0 ];then echo "$1$i success" >> $result_log else echo "$1$i faile" >> $result_log fi done } list_file(){ for net_name in `cat $network_file` do read_file_ping_1 $net_name & read_file_ping_2 $net_name & read_file_ping_3 $net_name & read_file_ping_4 $net_name & done } #define main main(){ #先清空日志文件 > $result_log list_file } #exec main main
高级版脚本
ping_ce_adv.sh 比较于基础版,高级版加入了脚本监测功能,如果系统中已经运行了该脚本,那么至上次运行结束前本脚本不能被执行。同时简化脚本的内容以循环代入的方式替换原来read_file_ping_[1-4]这4个函数,同时高级版可以设置把一个网段分割成几个段来执行,更好的加快执行速度。
#!/bin/bash #指定需要使用的网段文件位置;指定生成的日志文件存放位置。 network_file="network.list" result_log="result.log" #判断当前脚本是否运行,如果运行中的话就直接退出本次脚本运行。并提醒。 ps -ef |grep -i "timeout 2 ping -c" |grep -v grep &> /dev/null if [ $? -eq 0 ];then echo -e "\033[31m The script has already run. Please try again later. \033[0m" exit 99 fi #设置一个网段拆分成多少个小段执行ping,最小值为1,最大值为254 值越大速度越快 sub_num=16 #给一个网段直接后台运行 read_file_ping(){ for i in `seq $2 $3` do timeout 2 ping -c 1 $1$i &>/dev/null if [ $? -eq 0 ];then echo "$1$i success" >> $result_log else echo "$1$i faile" >> $result_log fi done } list_file(){ zhengshu=$((254/sub_num)) yushu=$((254%sub_num)) echo -e "\033[34m一个C被分成:$sub_num 段执行ping,一段有:$zhengshu 个IP地址,单独剩余:$yushu 个ip地址自成一段进行ping测.\033[0m" #如果有余数表示需要多一个文件 if [ $yushu -eq 0 ];then val_sub_num=${sub_num} else val_sub_num=$((sub_num+1)) fi for net_name in `cat $network_file` do #展示出分割过后的地址段的起始地址和末尾地址。 for i in `seq 1 $val_sub_num` do #如果这是有余数的这一段,那么多加一段 if [ $i -gt $sub_num ];then #echo "从 $((sub_num*zhengshu+1))" start_number=$((sub_num*zhengshu+1)) final_number=254 #echo "到 254" else #echo "从 $((i*zhengshu-zhengshu+1))" start_number=$((i*zhengshu-zhengshu+1)) final_number=$((i*zhengshu)) #echo "到 $((i*zhengshu))" fi #把得到的字符段带入其中执行 read_file_ping $net_name $start_number $final_number & done #echo "start exec next work addresss ping function....." done } #define main main(){ #先清空日志文件 > $result_log list_file echo -e "\033[32mThe script runs successfully. Please wait for $((254/sub_num*2)) seconds. \033[0m" } #exec main main
高级版执行结果
正常执行截图:
图 3
脚本未执行完再次执行脚本截图:
图 4