1、要求
获得整个局域网里哪些ip地址在使用,哪些没在用,同时显示在使用的ip地址对应的mac地址。写到文件里:
up.txt 保存正在使用的ip以及对应的mac地址。
down.txt:保存没有正在使用的ip地址。
2、需求分析:
①ping命令
②arp缓存表:记录ip对应的mac地址。
③网段:192.168.2.0/24 2.1~2.254
④for循环。
⑤扩展知识点:
arp -n:查看arp缓存表
arp:地址解析协议:address resolution protocol ,是将ip解析成对应的mac地址。
[root@nginx-kafka01 network-scripts]# arp -n Address HWtype HWaddress Flags Mask Iface 192.168.2.1 ether a4:1a:3a:38:8d:29 C ens33 192.168.2.123 ether 04:d3:b0:f6:91:7c C ens33
ping 是测试网络是否畅通的工具
ping 192.168.2.1 -c 4:表示只能发送4个数据包。
-c 发包的次数 count
[-w deadline] 多少时间内必须完成 期限
[-W timeout] 超过多少时间就停止 超时
[-i interval] 包和包之间的时间间隔 间隔
3、代码实现
#基础版的
[root@nginx-kafka01 shell]# cat scan_lan.sh #!/bin/bash #清空文件 >up.txt >down.txt #循环ping整个局域网里的ip地址 for i in {1..10} do #使用ping命令去测试这个ip地址是否使用,使用多个子进程去执行ping命令,提升并发的效果 #如果能ping通,说明$?返回值为0,写到up.txt 如果不通,就写到down.txt文件里 if ping -c 1 -W 1 192.168.2.$i &>/dev/null ;then echo "192.168.2.$i is up" echo "192.168.2.$i" >>up.txt else echo "192.168.2.$i is down" echo "192.168.2.$i" >>down.txt fi done
测试:
[root@nginx-kafka01 shell]# bash scan_lan_bak.sh 192.168.2.1 is up 192.168.2.2 is down 192.168.2.3 is down 192.168.2.4 is down 192.168.2.5 is down ...... [root@nginx-kafka01 shell]# cat up.txt 192.168.2.1 [root@nginx-kafka01 shell]# cat down.txt 192.168.2.2 192.168.2.3 192.168.2.4 192.168.2.5 192.168.2.6 .......
脚本优化:
1、速度提升,时间减少
2、资源消耗
串行:顺序执行
并行;同时进行
多进程和多线程
并发:在一段时间内一起执行,例如:1分钟内。
[root@nginx-kafka01 shell]# echo $$ #父进程 8228 [root@nginx-kafka01 shell]# bash scan_lan.sh #子进程 9516
子进程和父进程和孙子进程的原理:多进程和多线程
扩展知识点:
arping命令可以同时得到ip和对应的mac地址
也可以用来判断某个ip地址是否和其他冲突。
[root@nginx-kafka01 shell]# arping -I ens33 192.168.2.1 -c 1 ARPING 192.168.2.1 from 192.168.2.152 ens33 Unicast reply from 192.168.2.1 [A4:1A:3A:38:8D:29] 7.604ms Sent 1 probes (1 broadcast(s)) Received 1 response(s) [root@nginx-kafka01 shell]# arping -I ens33 192.168.2.1 -c 1|egrep Unicast Unicast reply from 192.168.2.1 [A4:1A:3A:38:8D:29] 6.659ms [root@nginx-kafka01 shell]# arp -n|grep ether 192.168.2.115 ether e8:d0:fc:dd:03:19 C ens33 192.168.2.108 ether 98:2c:bc:cb:1f:ba C ens33 192.168.2.230 ether 00:0c:29:ea:ac:65 C ens33 ...... [root@nginx-kafka01 shell]# time bash scan_lan.sh 9700 192.168.0.1 is used 192.168.0.6 is unused 192.168.0.7 is unused .......... real 0m1.039s user 0m0.015s sys 0m0.031s
优化之后的脚本文件:
[root@nginx-kafka01 shell]# cat scan_lan_bak_bak.sh #!/bin/bash #清空文件 >up.txt >down.txt #查看当前子bash的pid号 echo $$ num=$(echo $$) #查看过滤出当前子bash的父进程号 pstree -p |egrep $num #循环ping整个局域网里的ip地址 for i in {1..254} do #启动多进程去ping,提升效率,启动子进程放到后台去执行 (if ping -c 1 -W 1 192.168.2.$i &>/dev/null ;then echo "192.168.2.$i is up" else echo "192.168.2.$i is down" echo "192.168.2.$i" >>down.txt fi)& done #等待子进程结束,然后再退出 wait #将arp缓存表里的记录保存到up.txt arp -n|awk '/ether/{print $1,$3}' >up.txt
里面加上()&:表示将()里面的内容放在后台去执行。