web-dev-qa-db-ja.com

既知のMACアドレスから現在のIPを特定できますか?

Etherwakeを使用してローカルネットワーク上のマシンを起動するシェルスクリプトがあります。マシンが起動した後、IPアドレスがわかりません。

私自身の質問に答えようとしている間に、私は思いついた:

ip=$(ping -c 1 hostname | head -1 | awk '{print $3}' | sed 's/[()]//g')

このソリューションでは、リモートマシンのホスト名を知っていることを規定していますが、これはそれほど面倒ではありません。

MACアドレスしかわからない場合にIPを取得する方法はありますか?

25
ddoxey

これを行うための単一のコマンドがあるとは思わない。 1つのハックは、サブネットでpingスキャンまたはブロードキャストpingを実行し、次にMACアドレスのIPアドレスについてarpテーブルを照会することです。明らかに理想的なソリューションではありません。例:

nmap -sP 192.168.1.0/24 >/dev/null && arp -an | grep <mac address here> | awk '{print $2}' | sed 's/[()]//g'

ここで、nmapはpingスキャンを実行し、arpキャッシュに入力します。スキャンが完了したら、arpコマンドを使用してarpテーブルを印刷し、grep/awkでIPアドレスを引き出します。 nmapをブロードキャストpingに置き換えることもできますが、おそらく信頼性は高くありません。

31
Neal

私は単に使用します

ip neighbor | grep "00:1E:C9:56:3C:8E" | cut -d" " -f1
20
hanoo

ここに示されている他の方法は信頼性がありませんでした。 ip neighborの出力には常に最新の状態が含まれていなかったため、arp-scanを使用してネットワークを再スキャンしたため、スキャンの出力を使用してIPアドレスを取得しました。指定されたMACアドレス。

単一のネットワークインターフェイスをスキャンするには、次を使用します。

arp-scan -q -l --interface en4 2>/dev/null | grep "00:1E:C9:56:3C:8E" | cut -d$'\t' -f1

次のコマンドは、複数のネットワークインターフェイスを一度にスキャンします。

{ arp-scan -q -l --interface en0 2>/dev/null & arp-scan -q -l --interface en4 2>/dev/null } | grep "00:1E:C9:56:3C:8E" | cut -d$'\t' -f1
7
Lenar Hoyt

MACアドレスでarpコマンドとgrepを試すことができます

arp -a | grep "00:00:00:00:00:00"

(独自のMACアドレスに置き換えてください)

5
user3547021

これを行うことができるpythonモジュールを作成しました:

>>> from ethip import ethip
>>> print ethip.getip('00:1E:C9:56:3C:8E', '10.5.42.255')
10.5.42.3

IPを見つけるために迅速なarpリクエストを行い、見つかったものをキャッシュします。コードはgithubにあります。

3
David Mulder

ニール 回答には実際に時間がかかりすぎます。私は60k +のIP範囲で動作する必要がありました。これを機能させるコツは、pingのたびにarpテーブルをチェックすることです。これにより、根本的な問題も修正されます。不要です。私はそれをJava(ここでは threadedScan() を参照)で実行しました。起動コマンドを使用すると、fixedThreadPoolを使用すると高速に動作します(60kの範囲で約10秒)。

1
eaz