11

我想 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 秒!

有什么想法吗?

4

5 回答 5

9

让它更快的唯一方法是测试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;
于 2013-01-30T16:04:54.083 回答
7

您无法 ping MAC 地址。您只能 ping 一个 IP 地址,因此您要做的是找出属于某个 MAC 地址的 IP 地址并 ping 该 IP。ARP 用于查找具有特定 IP 地址的机器的 MAC 地址,但您不能真正反过来(技术上存在称为反向 ARP的协议,但在典型的操作系统中从未使用过)。找到 MAC 地址后,它会保存在 ARP 缓存中,因此您不必在几分钟内再次查找它,但这不是找到 MAC 地址的可靠方法,因为条目不会留在缓存长。你知道如何创建一个静态条目,但是如果你将 192.168.15.196 硬编码到那个 MAC 地址,你为什么不直接 ping 192.168.15.196 (这就是你的全部)

于 2013-03-19T22:01:29.477 回答
5

nmap 有 -T 选项来加速这样的事情。-T 5 是最快的。

您也可以尝试 --min-parallelism 选项。

于 2013-08-15T14:18:58.820 回答
5

将上述好的答案组合成一个脚本:(用法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地址维护网络设备列表,并显示每个设备的在线/离线状态。
用途包括:

  • 监控您的服务器状态
  • 检查您的互联网连接是否正常
  • 检查特定设备是否已连接到您的 wifi
  • 检查您的智能电视是否真的关闭了
  • 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='\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
于 2017-04-18T17:40:49.877 回答
2

这是另一个更简单的答案。

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

请注意,mac 地址必须使用小写字母。

arp-scan 似乎比 arp 运行得快得多。

于 2017-08-04T23:12:04.873 回答