web-dev-qa-db-ja.com

LinuxでMACアドレスにpingする方法

既知のMACアドレスにpingしたいので、nmapを使用しようとしました。

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

しかし、この場合、MACアドレスを取得するまで、すべての255のIPアドレス(192.168.15.1から192.168.15.255まで)にpingを送信します。これには、約4秒かかります。

何かアイデアはありますか?

9
Linux

高速化する唯一の方法は、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;
8
Davide Berra

MACアドレスにpingすることはできません。 pingできるのはIPアドレスだけなので、実行しようとしているのは、特定のMACアドレスに属するIPアドレスを見つけて、そのIPにpingすることです。 ARPは特定のIPアドレスを持つマシンのMACアドレスを見つけるために使用されますが、実際には逆に行くことはできません(技術的には Reverse ARP というプロトコルが存在しますが、通常は使用されませんオペレーティングシステム)。 MACアドレスが見つかると、それはARPキャッシュに保持されるため、数分間再度検索する必要はありませんが、MACアドレスを見つけるための信頼できる方法ではありません。長いキャッシュ。静的エントリを作成する方法を理解しましたが、そのMACアドレスに192.168.15.196をハードコーディングしている場合は、192.168.15.196にpingを送信するだけです(とにかくそれだけです)。

5
PherricOxide

上記の良い答えを単一のスクリプトに結合する:(使用法: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アドレスごとにネットワークデバイスのリストを維持し、それぞれのオンライン/オフラインステータスを表示します。
用途は次のとおりです。

  • サーバーのステータスを監視する
  • インターネット接続が確立されていることの確認
  • 特定のデバイスがあなたの無線LANに接続されているかどうかを確認する
  • スマートテレビのチェックが本当にオフになっている

各デバイス名は、オンラインの場合は緑色、オフラインの場合は赤色で表示されます。
デバイスのステータスが変化すると、デスクトップ通知が表示されます。

Linuxミントの下でテストされ、他のディストリビューションで動作するはずです。

#!/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
5
Mtl Dev

nmapには、このような処理を高速化する-Tオプションがあります。 -T 5が最速です。

--min-parallelismオプションを試すこともできます。

5
MDB

ここに別のかなり簡単な答えがあります。

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

MACアドレスには小文字を使用する必要があることに注意してください。

arp-scanはarpよりもはるかに高速に実行されるようです。

2
Julian Knight