(脚本默认网段掩码为24,也没有参数检查之类的功能)
(不同平台命令语句会有差别,可能需要稍微修改,测试平台是Kali)
#!/bin/bash
## 保证参数个数正确
if [ "$#" -ne 1 ];then ##"$#" 参数个数 ##[Int1 -ne Int2] 比较Int1和Int2值,不等为真
echo "参数错误:请使用 ./scan_arp.sh [interface]" ##scan_arp.sh是脚本文件名,这里仅仅是提示作用
echo "如./scan_arp.sh wlan0"
exit
fi
## 根据输入的网卡名查询IP
## 先筛选出含"inet"的行;然后以‘t’隔开,选取隔开后第二个域;再以'.'隔开,选取第1-3个域,也就是IP地址前24位;最后选取第一行(可能会有IPv6地址也被筛出)
interface=$1 ##$1 运行脚本时输入的第一个参数
prefix=$(ifconfig $interface | grep "inet" | cut -d 't' -f 2 | cut -d '.' -f 1-3 | head -n 1)
echo "================================================================================"
echo "网段是:"$prefix
echo "================================================================================"
## 默认掩码24,遍历扫描
for addr in $(seq 1 254);do
ans=$(arping -c 1 $prefix.$addr |grep "bytes from" | cut -d" " -f 5 | cut -d "(" -f 2 | cut -d ")" -f 1)
## 有回复的ARP包则会有"bytes from"字段,根据这个判断是否在线
if [ -n "$ans" ];then ##[-n str] 判断str长度,非零为真;[-z str] 判断str长度,零为真
echo $ans":在线!"
else
echo $prefix.$addr":离线."
fi
done
运行样例: