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/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 扫一扫 运维公众号 |