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

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

在试图回答我自己的问题时,我想到了:

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

这个解决scheme规定,我知道远程机器的主机名,这并不麻烦。

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

Solutions Collecting From Web of "我可以从一个已知的MAC地址确定当前的IP吗?"

我不认为有一个单一的命令来做到这一点。 一个黑客可能会在子网上执行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,但这可能不是那么可靠。

我会简单地使用

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

我写了一个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上。

这里提出的其他方法是不可靠的,例如, ip neighbor的输出并不总是包含最近的状态,所以我最终使用arp-scan重新扫描网络,因此我简单地使用扫描的输出来获得给定MAC地址的IP地址。

要扫描单个网络接口,只需使用以下命令:

 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 

尼尔的答案确实太长了。 我必须得到它与60k + IPs范围的工作。 做这个工作的技巧是在每次ping之后检查arp表。 这也解决了根本问题:没有必要。 我是用Java做的(见这里的threadedScan() ),因为我在windows上,需要一个解决方案,在尝试使用启动命令ping时,不会产生数千个cmd提示。 它的工作更快(我的60K范围〜10秒)与fixedThreadPool。