我可以从已知的MAC地址确定当前的IP吗?

时间:2012-11-25 16:18:36

标签: linux networking

我有一个shell脚本,它使用etherwake来唤醒我本地网络上的一台机器。 机器醒来后,我不确定IP地址。

在尝试回答我自己的问题时,我提出了:

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

这个解决方案规定我知道远程机器的主机名,这不是那么繁重。

如果我所知道的是MAC地址,有没有办法获得IP?

7 个答案:

答案 0 :(得分:27)

我认为没有一个命令可以做到这一点。一个hack是在子网上进行ping扫描或广播ping,然后在arp表中查询MAC地址的IP地址。显然不是一个理想的解决方案。例如:

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地址。您可以尝试使用广播ping替换nmap,但这可能不那么可靠。

答案 1 :(得分:19)

我只想使用

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

答案 2 :(得分:7)

此处介绍的其他方法不可靠,例如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

答案 3 :(得分:4)

您可以尝试使用arp命令和grep by mac address

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

(替换为您自己的mac地址)

答案 4 :(得分:2)

我编写了一个可以执行此操作的python模块:

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

我只是发出快速的arp请求来查找ip,然后缓存它找到的内容。代码在github上。

答案 5 :(得分:1)

Neal's回答确实太长了。我不得不使用60k + IPs系列。使这项工作的诀窍是在每次ping之后检查arp表。这也解决了根本问题:没有必要。我是用Java编写的(参见threadedScan() here),因为我在Windows上需要一个解决方案,在尝试用start命令ping时不会产生数千个cmd提示。使用fixedThreadPool,它的工作速度更快(我的60k范围约为10秒)。

答案 6 :(得分:1)

我知道它很旧,但是在Linux中最简单的方法是:

arp -a | grep "00:1E:C9:56:3C:8E"

这样做的目的是忽略是否在一个或另一个网络中连接,同时每台设备都能看到对方。