Как пинговать MAC-адрес в Linux

Я хочу пинговать известный MAC-адрес, я попытался использовать nmap:

sudo nmap -sP 192.168.15.1/24 | grep  20:64:32:3F:B1:A9

но в этом случае его пинг все 255 IP-адресов (от 192.168.15.1 до 192.168.15.255), пока не получите мой MAC-адрес, и это займет много времени около 4 сек.!

есть идеи, пожалуйста?

5 ответов


единственный способ сделать это быстрее-проверить, если mac-адрес уже находится в вашей таблице arp

#!/bin/bash

# extract ip from local arp table
ip=$(arp | grep 20:64:32:3F:B1:A9 | awk ' { print  } ')

# 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;

вы не можете пинговать MAC-адрес. Вы можете только пинговать IP-адрес, поэтому вы пытаетесь выяснить, какой IP-адрес принадлежит определенному MAC-адресу и пинговать этот IP-адрес. ARP используется для поиска MAC-адреса машины с определенным IP-адресом, но вы не можете пойти другим путем (технически протокол называется обратный ARP существует, но никогда не используется в типичных операционных системах). Как только MAC-адрес будет найден, он будет храниться в кэше ARP, поэтому у вас нет чтобы посмотреть его снова в течение нескольких минут, но это не надежный способ найти MAC, потому что записи не остаются в кэше долго. Вы выяснили, как сделать статическую запись, но если вы жестко кодируете 192.168.15.196 на этот MAC-адрес, почему бы вам просто не пинговать 192.168.15.196 (это все, что вы делаете в любом случае)?


nmap имеет опцию-T для ускорения таких вещей. -Т 5 является самым быстрым.

вы также можете попробовать опцию --min-parallelism.


объединение вышеуказанных хороших ответов в один скрипт: (Использование:macping aa:bb:cc:dd:ee:ff)

#!/bin/bash
network=192.168.1.1/24
if [ "$#" -ne 1 ]; then echo Usage example:  aa:bb:cc:dd:ee:ff; exit 2; fi;
nmap -sP -T4 $network >& /dev/null
ip=$(arp -n | grep  | awk ' { print  }')
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: для поддержания списка сетевых устройств, по mac-адресу, и отображать онлайн/оффлайн статус каждого.
Пользы включают:

  • мониторинг состояния вашего сервера
  • проверка подключения к интернету составляет
  • проверка, если конкретное устройство подключено к вашему wifi
  • проверка вашего smart TV действительно выкл
  • etc

каждое имя устройства отображается зеленым цветом, если в сети, красным, если в автономном режиме.
Уведомление рабочего стола отображается при изменении состояния устройства.

протестировано под linux mint, должно работать на других дистрибутивах.

#!/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='3[1;31m'  
BGreen='3[1;32m' 
Reset='3[m'

function mactoip(){
  echo $(arp -n | grep -i $mac | awk ' { print  }')
}

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

вот еще один и довольно простой ответ.

ping $(arp-scan --localnet | grep 80:1f:02:fa:90:b7  | awk ' { printf  } ')

обратите внимание, что mac-адрес должен использовать строчные буквы.

arp-scan работает намного быстрее, чем arp.