【问题标题】:How to ping MAC address in Linux如何在 Linux 中 ping MAC 地址
【发布时间】:2013-01-14 01:26:24
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: ip ping mac-address arp


    【解决方案1】:

    让它更快的唯一方法是测试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;
    

    【讨论】:

    • 想回复,代码不起作用,它给了我:用法:ping [-LRUbdfnqrvVaAD] [-c count] [-i interval] [-w deadline] [-p pattern] [-s packetsize] [-t ttl] [-I interface] [-M pmtudisc-hint] [-m mark] [-S sndbuf][-T tstamp-options] [-Q tos] [hop1 ...]目的地
    • 好的,这是一个很好的解决方案和它的工作,但它总是给我“找不到本地 arp 表。尝试另一种方式......”即使我使用了另一个 mac 地址,而两者都找到了在本地网络中!这意味着mac地址不在arp表中。如何将其插入表中?我用 sudo nmap -sP 192.168.15.1/24 | grep 20:64:32:3F:B1:A9,但它仍然不在 arp 表中?
    • 我通过sudo arp -s 192.168.15.196 20:64:32:3F:B1:A9添加了mac地址,不知道这样对不对。我觉得应该加自动,因为在本地网络中找到了 mac 地址,但无论如何,你的脚本现在工作得很好。感谢您的解决方案。
    • 使用 "arp -n" 会快很多,从 17.0 秒到 0.003 秒
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        将上述好的答案组合成一个脚本: (用法: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
        • 检查您的智能电视确实关闭
        • 等

        在线时每个设备名称显示为绿色,离线时显示为红色。
        设备状态更改时会显示桌面通知。

        在 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
        

        【讨论】:

        • 好东西,对于监控谁在我的网络上连接非常有用。现在...我通过 VPN 连接到我公司的网络:有没有办法让这个 arp 魔法在远程网络上工作?我尝试了一点,到目前为止没有成功。
        • 由于我经常在这里和那里复制和粘贴终端内容,因此在传输过程中颜色往往会消失。因此,我稍微修改了您的脚本以应对色盲和文本复制粘贴:我只是将颜色的定义替换为如下:` BRed='\033[1;31m [ OFF ] ' BGreen='\033[1 ;32m [ ON ] ' ` 我还在循环的开头更改了clear,为echo "_________________________________________",我猜只是口味问题...
        • nmap 需要--send-ip 才能更新系统 ARP 表。
        【解决方案5】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-08
          • 2012-07-15
          相关资源
          最近更新 更多