I want to ping a known MAC address, I tried to use nmap:
sudo nmap -sP 192.168.15.1/24 | grep 20:64:32:3F:B1:A9
But in this case its ping all
The only way to make it faster is to test if the mac address is already into your arp table
#!/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;
You can't ping a MAC address. You can only ping an IP address, so what you're trying to do is find out what IP address belongs to a certain MAC Address and ping that IP. ARP is used to find the MAC address of a machine with a certain IP address, but you can't really go the other way around (technically a protocol called Reverse ARP exists, but it's never used in typical operating systems). Once the MAC address is found, it'll be kept in the ARP cache so you don't have to look it up again for a few minutes, but that's not a reliable way to find the MAC because entries don't stay in the cache long. You figured out how to make a static entry, but if you're hard coding 192.168.15.196 to that MAC address, why don't you just ping 192.168.15.196 (that's all you're doing anyway)?
Here is another and rather simpler answer.
ping $(arp-scan --localnet | grep 80:1f:02:fa:90:b7 | awk ' { printf $1 } ')
Note that the mac address has to use lower case letters.
arp-scan seems to run much faster than arp.
Combining the above good answers into a single script:
(Usage: 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;
Extending: To maintain a list of network devices, by mac address, and display the online/offline status of each.
Uses include:
Each device name is displayed in green if online, red if offline.
A desktop notification is displayed when a device status changes.
Tested under linux mint, should work on other distro's.
#!/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
nmap has the -T option to speed things like this up. -T 5 is the fastest.
You can also try the --min-parallelism option.