How to ping MAC address in Linux

后端 未结 5 1407
南方客
南方客 2021-01-31 12:19

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

相关标签:
5条回答
  • 2021-01-31 12:57

    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;
    
    0 讨论(0)
  • 2021-01-31 13:05

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

    0 讨论(0)
  • 2021-01-31 13:07

    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.

    0 讨论(0)
  • 2021-01-31 13:12

    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
    
    0 讨论(0)
  • 2021-01-31 13:15

    nmap has the -T option to speed things like this up. -T 5 is the fastest.

    You can also try the --min-parallelism option.

    0 讨论(0)
提交回复
热议问题