Shell多进程ping检测指定网段ip是否在线

要实现Ping一个网段的所有IP,并检测网络连接状态是否正常,很多方法都可以实现,下面简单介绍两种,一种为单进程,一种为多进程。

ping单进程检测(挨个处理

#!/bin/bash
read -p "请输入IP网络位:" ip  #从键盘输入,注意ip前面要有个空格
for i in $(seq 1 254) #seq用于生成数字1~254
       do
           {
              ping $ip.$i -c1 -s1 2>&1 1>/dev/null &&  #$ip和$i是两个传入参数代表网络位和主机位。2>&1 将标准>输出错误重定向标准输出到屏幕,/dev/null代表linux的空设备文件,也就>是将标准输出1重定向到/dev/null中,
              echo -e ping $ip.$i 是 "\033[32;49;1m通的! \033[39;49;0m" ||
              echo -e ping $ip.$i 是 "\033[31;49;1m不通的! \033[39;49;0m" #这>里显示结果,""里代表字符串颜色 
                                                       }
done
echo "扫描检测已结束。"

ping多进程检测(使用'&'+wait 实现)

#!/bin/bash
read -p "请输入IP网络位:" ip  #从键盘输入,注意ip前面要有个空格
for i in $(seq 1 254) #seq用于生成数字1~254
    do
    { 
           ping $ip.$i -c1 -s1 2>&1 1>/dev/null &&  #$ip和$i是两个传入参数代表网络位和主机位。2>&1 将标准输出错误重定向标准输出到屏幕,/dev/null代表linux的空设备文件,也就是将标准输出1重定向到/dev/null中,
           echo -e ping $ip.$i 是 "\033[32;49;1m通的! \033[39;49;0m" || 
        echo -e ping $ip.$i 是 "\033[31;49;1m不通的! \033[39;49;0m" #这里显示结果,""里代表字符串颜色 
        } &  #注意在shell中不支持多线程的.这里&是采用多进程执行方式,{}里执行了,不管结束没结束继续执行下一条.

done
wait #{}执行完,执行下一条,相当于高级语言多线程同步作用.
echo "扫描检测已结束。"

测试如图:

ping常用参数说明:

  • -c count:指定ping检测次数;
  • -w deadline:设定检测时间为秒,不管能否通,达到限制时间就结束ping过程;
  • -I interface:指定网络接口或者本机地址发出数据包;
  • -t ttl :设置TTL(Time To Live)为指定的值,该字段指定IP包被路由器丢弃之前允许通过的最大网段数;
  • -s packetsize:指定每次ping发送的数据字节数,默认为“56字节”+“28字节”的ICMP头,一共是84字节。包头+内容不能大于65535,所以最大值为65507(linux:65507, windows:65500);
  • -W timeout:等待回复的时间,单位是毫秒。这个选项只在没有接到任何的回复的情况下有效,只要接到了一个回复,就将等待时间设置为两倍的RTT。如果没有设置,则等待时间设置为一个最大值;

总结:Shell不支持多线程,因此只能采用多进程的方式。具体的实现方法就是在要并发循环体中执行的命令后面加上“&”,将其转入后台执行,这样就可以在执行完一条命令之后,不必等待其执行结束,可以同时进行,提升效率。

 

来源:https://mefj.com.cn/lur3644.html

作者:运维密码
出处:https://mefj.com.cn/
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出。以免更多的人被误导。

     扫一扫 运维公众号

posted @ 2021-08-11 10:40  运维密码  阅读(88)  评论(0编辑  收藏  举报