Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to ping MAC address in Linux

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 255 IP address (from 192.168.15.1 to 192.168.15.255) until get my MAC address, and that take a long time about 4 sec.!

any idea please?

like image 871
Linux Avatar asked Jan 30 '13 09:01

Linux


People also ask

Can we ping to MAC address?

Ping the device you want to find a MAC address for using the local network address. Enter the ARP command with a "-a" flag. Look for the IP address in the results. The Mac address is next to the IP address.

Is there a ping command in Linux?

In Linux, the ping command is a general utility which is used for checking whether any network is present and if a host is attainable. We can test if the server is up and executing using this command. Also, it helps several connectivity issues with troubleshooting.


4 Answers

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)?

like image 96
PherricOxide Avatar answered Oct 12 '22 03:10

PherricOxide


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;
like image 23
Davide Berra Avatar answered Oct 12 '22 02:10

Davide Berra


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:

  • Monitoring your server status's
  • checking your internet connection is up
  • checking if a specific device has connected to your wifi
  • checking your smart TV is really off
  • etc

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
like image 20
Mtl Dev Avatar answered Oct 12 '22 02:10

Mtl Dev


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.

like image 34
Julian Knight Avatar answered Oct 12 '22 01:10

Julian Knight