https://blog.csdn.net/weixin_42036645/article/details/84979151
其实都挺挺简单的 shell 脚本 需要多学习 多练习
原创努力的小码农 Nick 发布于 2018-12-12 20:46:11 阅读数 1078 收藏
展开
1. 发现问题
今天在学习的时候突然有一个想法, 想要看一下自己教室网段内的 ip 占用情况, 如果一个一个的 IP 去 ping 的话会花费大量时间于是自己尝试用 shell 脚本来解决这个问题.
需求:
我的 ip 是 192.168.22.122, 我想要查看 22 网段下所有的 ip 使用情况, 是否有人在使用某些 ip, 是否可以 ping 通该网段的所有 ip.
2. 编程思想
1. 基于: ping 192.168.22.xxx 来获取相应的返回情况.
我使用的是 centos7 的虚拟机桥接模式.
成功返回:
64 bytes from 192.168.22.121: icmp_seq=1 ttl=128 time=1.50 ms
失败返回:
From 192.168.22.80 icmp_seq=1 Destination Host Unreachable
如果成功的话, 返回的字符串中会带有 "ttl" 字符串, 所以可以依据这个来作为是否 ping 通的判断条件.
2. shell 的循环
用 For 循环和 while do 循环都可以, 需要让变量 $i 从 0-255 即可
3. shell 的多线程
再结合了上面两个方法以后, 发现 255 个 ip 一个一个 ping 还是很慢, 所以就想到了多线程的方法, 把 1 次运行 ping 和判断调用 1 个线程, 一共使用 255 个线程, 速度是真滴快.
3. 代码
- #!/bin/bash
- star=`date +%s`
- echo "*********Running...**********"
- for ((i = 0; i <= 255; i++))
- do
- {
- ping 192.168.22.$i -c 2 |grep -q "ttl=" && echo "192.168.22.$i yes">> ipyes.txt || echo "192.168.22.$i no">> ipno.txt
- }&
- done
- wait
- end=`date +%s`
- echo $end
- echo "*************Spent Time:`expr $end - $star `**************"
结果
我将结果重定向到了两个文件 ipyes 和 ipno 中, yes 为正在占用的 ip,no 未未在使用的 ip.
使用方法
VIM 一个 shell 脚本, 粘贴代码, 然后将 ip 改成自己的网段就行, sh 运行脚本.
4. 运行截图
脚本
运行情况
运行结果
十几秒秒就可以 ping 完网段下所有 ip, 并把结果写在文档里, 够快吧, 嘿嘿
----------------
来源: http://www.bubuko.com/infodetail-3363169.html