目录
1、问题描述
编写一个局域网扫描工具,获得整个局域网里哪些ip地址在使用,哪些没有在使用,同时显示在使用的ip地址对应的MAC地址,写到文件里,使用了的写入up.txt文件, 没有使用的写入down.txt文件。
2、需求分析
针对上述问题,提取需求分析如下:
① 获取整个局域网内的IP地址
② 区分出哪些IP正在使用,并保存入up.txt文件内,哪些IP未被使用,并保存入down.txt文件内。
③同时显示使用的IP地址对应的MAC地址,一并存入up.txt文件内。
3、编写脚本
下面是编写的第一个版本,但是扫描所需要的时间太长了,逐个IP进行扫描,速度太慢。
#!bin/bash
#循环ping整个局域网里的ip地址
for i in {1..254}
do
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
脚本解析:
使用for循环将IP逐个进行ping测试,使用if语句进行判断,如果ping的通就是正在使用的IP,反之则是未被使用的。
ping命令的-W 是timeout,设置一个时间期限1秒钟; -c 为count数量,只ping一个包,$i是引用i这个变量。&>/dev/null,将获取到的一下不需要的输出写入到/dev/null这个文件,/dev/null俗称“黑洞”文件,是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。
>>这个符号为追加重定向,将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,新数据将写入到原有内容的后面。
4、脚本优化
版本2使用多进程,可以将速度大大提高。
#!bin/bash
#清空文件
>up.txt
>down.txt
#循环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
脚本解析:
>符号:将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,会清空原有数据,再写入新数据。
这样up.txt文件和down.txt文件,每次测试的时候就只会保存当前这次测试的数据。
arp命令,可以来检查某个IP是否和其他的IP冲突了,arp命令可以同时得到ip和对应的MAC地址,也可以用来判断某个ip地址是否和其他ip冲突,使用的效果如下。
[root@nginx-kafka03 linux-test]# arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.2.2 ether 00:60:89:c0:00:08 C ens33
192.168.2.3 ether 00:60:89:ff:f6:05 C ens33
使用awk命令进行截取,awk的具体使用可以参考下文。
(2条消息) Linux的文本三剑客awk、sed、grep及其他文本处理命令,详细解析_忙碌且充实的博客-CSDN博客
脚本的运行结果如下。
[root@nginx-kafka03 linux-test]# cat up.txt
192.168.2.2 00:60:89:c0:00:08
192.168.2.3 00:60:89:ff:f6:05
[root@nginx-kafka03 linux-test]# cat down.txt
192.168.2.4
192.168.2.5
192.168.2.13
192.168.2.9
192.168.2.11
...