批量ping-网段版

发布时间 2023-05-27 19:13:47作者: 飞翔的小胖猪

说明

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

脚本未执行完再次执行脚本截图: