我有一个 shell 脚本,它使用 etherwake 唤醒本地网络上的一台机器。机器唤醒后,我不确定IP地址。
在尝试回答我自己的问题时,我想出了:
ip=$(ping -c 1 hostname | head -1 | awk '{print $3}' | sed 's/[()]//g')
这个解决方案规定我知道远程机器的主机名,这不是那么繁琐。
如果我只知道 MAC 地址,有没有办法获取 IP?
我有一个 shell 脚本,它使用 etherwake 唤醒本地网络上的一台机器。机器唤醒后,我不确定IP地址。
在尝试回答我自己的问题时,我想出了:
ip=$(ping -c 1 hostname | head -1 | awk '{print $3}' | sed 's/[()]//g')
这个解决方案规定我知道远程机器的主机名,这不是那么繁琐。
如果我只知道 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 -i "00:1E:C9:56:3C:8E" | cut -d" " -f1
这里介绍的其他方法不可靠,例如 的输出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
您可以尝试 arp 命令并通过 mac 地址 grep
arp -a | grep "00:00:00:00:00:00"
(用你自己的mac地址替换)
我写了一个可以做到这一点的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上。
我知道是旧的,但 linux 中最简单的方法是:
arp -a | grep "00:1E:C9:56:3C:8E"
这样做的目的是忽略是否连接在一个或另一个网络中,同时每个设备都可以看到彼此。
尼尔的回答确实太长了。我必须让它在 60k+ IPs 范围内工作。完成这项工作的诀窍是在每次 ping 后检查 arp 表。这也解决了根本问题:不需要。我是用 Java 做的(参见这里的 threadedScan()),因为我在 Windows 上,需要一个在尝试使用 start 命令 ping 时不会产生数千个 cmd 提示的解决方案。使用固定线程池,它的工作速度更快(我的 60k 范围约为 10 秒)。