37

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

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

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

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

如果我只知道 MAC 地址,有没有办法获取 IP?

4

7 回答 7

43

我认为没有一个命令可以做到这一点。一种技巧是在子网上进行 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,但这可能不那么可靠。

于 2012-11-25T16:44:46.847 回答
32

我会简单地使用

ip neighbor | grep -i "00:1E:C9:56:3C:8E" | cut -d" " -f1
于 2016-04-01T22:38:44.037 回答
11

这里介绍的其他方法不可靠,例如 的输出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
于 2017-03-01T00:08:13.593 回答
8

您可以尝试 arp 命令并通过 mac 地址 grep

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

(用你自己的mac地址替换)

于 2017-12-13T13:06:01.483 回答
3

我写了一个可以做到这一点的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上。

于 2014-07-11T22:53:18.547 回答
2

我知道是旧的,但 linux 中最简单的方法是:

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

这样做的目的是忽略是否连接在一个或另一个网络中,同时每个设备都可以看到彼此。

于 2020-08-20T05:45:54.473 回答
1

尼尔的回答确实太长了。我必须让它在 60k+ IPs 范围内工作。完成这项工作的诀窍是在每次 ping 后检查 arp 表。这也解决了根本问题:不需要。我是用 Java 做的(参见这里的 threadedScan()),因为我在 Windows 上,需要一个在尝试使用 start 命令 ping 时不会产生数千个 cmd 提示的解决方案。使用固定线程池,它的工作速度更快(我的 60k 范围约为 10 秒)。

于 2017-06-24T13:35:51.287 回答