我想ping一个已知的MAC地址,我尝试使用nmap:
sudo nmap -sP 192.168.15.1/24 | grep 20:64:32:3F:B1:A9
但是在这种情况下它会ping所有255个IP地址(从192.168.15.1到192.168.15.255),直到获得我的MAC地址,这需要很长时间大约4秒。
有什么想法吗?
答案 0 :(得分:8)
使速度更快的唯一方法是测试mac地址是否已经进入你的arp表
#!/bin/bash
# extract ip from local arp table
ip=$(arp | grep 20:64:32:3F:B1:A9 | awk ' { print $1 } ')
# found an ip tied to the mac address?
if [ ! -z $ip ]; then
# if found, do you want to ping it?
ping $ip
else
echo "Not found into local arp table. Trying another way..."
# wanna try your nmap strategy?
# sudo nmap -sP 192.168.15.1/24 | grep 20:64:32:3F:B1:A9
fi;
答案 1 :(得分:5)
您无法ping通MAC地址。您只能ping一个IP地址,所以您要做的是找出哪个IP地址属于某个MAC地址并ping该IP。 ARP用于查找具有特定IP地址的计算机的MAC地址,但您无法真正相反(技术上称为Reverse ARP的协议存在,但它从未在典型的操作系统中使用)。找到MAC地址后,它将被保存在ARP缓存中,因此您不必再查看几分钟,但这不是查找MAC的可靠方法,因为条目不会留在缓存很久。你想出了如何创建一个静态条目,但是如果你硬编码192.168.15.196到那个MAC地址,你为什么不ping 192.168.15.196(那就是你所做的一切)?
答案 2 :(得分:5)
nmap有-T选项来加速这样的事情。 -T 5是最快的。
您也可以尝试使用--min-parallelism选项。
答案 3 :(得分:4)
将上述好的答案合并到一个脚本中:
(用法:macping aa:bb:cc:dd:ee:ff
)
#!/bin/bash
network=192.168.1.1/24
if [ "$#" -ne 1 ]; then echo Usage example: $0 aa:bb:cc:dd:ee:ff; exit 2; fi;
nmap -sP -T4 $network >& /dev/null
ip=$(arp -n | grep $1 | awk ' { print $1 }')
ping $ip -n -q -c 2 -i 0.2 -w 1 >& /dev/null
if [ $? -eq 0 ]; then
echo Device is online \($ip\)
else
echo Device is offline
exit 1
fi;
扩展:通过mac地址维护网络设备列表,并显示每个设备的在线/离线状态 用途包括:
如果在线,每个设备名称显示为绿色,如果离线,则显示为红色 设备状态更改时会显示桌面通知。
在linux下测试,应该在其他发行版上工作。
#!/bin/bash
#Create associated array's
declare -A devicelist #device name: mac address
declare -A statuslist #device name: online status
devicelist[Server01]=aa:bb:cc:dd:ee:01
devicelist[Server02]=aa:bb:cc:dd:ee:02
devicelist[MyPhone] =aa:bb:cc:dd:ee:03
devicelist[SmartTV] =aa:bb:cc:dd:ee:04
#Colour Constants
BRed='\033[1;31m'
BGreen='\033[1;32m'
Reset='\033[m'
function mactoip(){
echo $(arp -n | grep -i $mac | awk ' { print $1 }')
}
while [ true ]; do
clear
arp_cache_rebuilt=no
for devicename in ${!devicelist[@]}; do
status=OFFLINE
mac=${devicelist[${devicename}]}
ip=$( mactoip $mac )
if [ -z $ip ] && [ $arp_cache_rebuilt = "no" ]; then
#we need to rebuild the arp cache...
nmap -sn -T4 192.168.1.0/24 >& /dev/null
ip=$( mactoip $mac )
arp_cache_rebuilt=yes
fi;
if [ ! -z $ip ]; then
ping $ip -n -q -c 2 -i 0.2 -w 1 >& /dev/null
if [ $? -eq 0 ]; then status=ONLINE; fi
fi;
#if device's previous status not yet recorded, then set it now.
if [ ! ${statuslist[${devicename}]+_} ]; then statuslist[${devicename}]=$status; fi
if [ $status = "ONLINE" ]; then colour=$BGreen; else colour=$BRed; fi;
echo -e ${colour}${devicename}${Reset} - $ip
if [ ${statuslist[${devicename}]} != $status ]; then
notify-send -i ac-adapter -u critical -t 1000 $status "$devicename"
fi;
statuslist[$devicename]=$status
done
echo -
sleep 5
done
答案 4 :(得分:2)
这是另一个相当简单的答案。
ping $(arp-scan --localnet | grep 80:1f:02:fa:90:b7 | awk ' { printf $1 } ')
请注意,mac地址必须使用小写字母。
arp-scan似乎比arp运行得快得多。