获取局域网当前主机所在网段已经在用的IP

背景

用etter作dns欺骗的时候,发现查询局域网IP,手机占用的IP有时候扫描不出来,无法展示到列表中,抓了包看到etter启动扫描局域网是遍历网段所有IP,广播arp请求,可是电脑端的都会正常应答,手机端的确没有。后来测试了下,不用etter扫描,直接ping的话,是有arp应答的(手机端)。用etter扫描测试,手机(小m6)锁屏,可能出现没有arp应答。

毕竟我知道局域网内某个人是用了手机的,但是不知道具体IP是很尴尬的(只能确定已经显示的IP列表肯定没有这个手机IP,但不知道这个用手机的小伙伴IP是多少),我总不能对整个网段的主机作arp缓存中毒攻击(只想针对这个IP),所以写了个脚本,把当前局域网(只针对B类和C类局域网)主机所在网段的所有IP给ping出来。就当替代使用etter扫描主机列表了。

脚本代码

用的bash shell,我加的有注释,就直接粘代码了。

#! /bin/bash

#获得主机所有接口ip
ips=(`hostname -I`)
#输入某些ip
#ips=($1)

#创建记录ip文件
ip_record_file=.ip_record_file
touch $ip_record_file

#分隔符设置,字符串分隔,这里不能用这个了,换个方式
#OLD_IFS=$IFS
#IFS=.

ping_ip()
{
	#ping 1 次ip,如果成功,便认为IP存在
	ping $ip -W 1 -c 1 &>/dev/null
	[ $? -eq 0 ] && echo $ip >> $ip_record_file
}

resolve_ip()
{
	#不尝试获取网关,解析IP前三个字段,1-254主机全部测试
	ip_head=`echo $1 | sed 's/\([0-9]\+\.[0-9]\+\.[0-9]\+\.\).*/\1/g'`;
	for i in `seq 1 254`
	do
		ip="$ip_head$i"
		[[ $ip = $1 ]] && continue;
		ping_ip $ip &
	done
	wait
}

for my_ip in $ips
do
	#只处理B类和C类的局域网IP范围
	#如是B类,172.16.0.0 - 172.31.255.255
	[[ $my_ip =~ ^172* ]] && my_ip_sperators=(${my_ip//./ }) && two_num=${my_ip_sperators[1]};
	if [[ $two_num > 15 && $two_num < 32 ]];then
		resolve_ip $my_ip  &
	fi

	#如果是C类,192.168.0.0 - 192.168.255.255
	[[ $my_ip =~ ^192\.168* ]] && resolve_ip $my_ip  &
done
wait
cat $ip_record_file | sort -u
rm $ip_record_file
发布了136 篇原创文章 · 获赞 81 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/x763795151/article/details/99131341