【问题标题】:Can I determine the current IP from a known MAC Address?我可以从已知的 MAC 地址确定当前 IP 吗?
【发布时间】:2012-11-13 05:21:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如果您知道主机名,请解析它的 ip,就像解析任何其他主机名一样。需要注意的是,ping 命令首先在其代码中调用 gethostbyname 来解析主机名的 ip。
  • 如果您与具有已知 MAC 地址的系统位于同一交换机/集线器/交叉阴谋集团,则可以执行 RARP
  • @ahmad :看起来 arping 是获取已知 IP 的 MAC 的便捷方式。我没有看到它可以以另一种方式工作。
  • @johnathon :追求这个问题使我得出结论,知道主机名可以导致其他一切。 gethostip -- 主机名 => IP arping -- 主机名 => IP 和 MAC
  • resolving mac address for IP 的可能重复项

标签: linux networking


【解决方案1】:

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

【讨论】:

  • 这实现了我的目标。谢谢!综上所述,我认为我的程序只使用远程机器的主机名并不是没有道理的。
  • 当你有一个非常大的网络时,例如/16 子网这需要太长时间:(
  • 对我不起作用。 arp -an 只输出 4 个随机地址,nmap ... 不会改变这一点。
  • 为什么不单独使用 arp 呢?对我来说 ip=$(arp -a | grep $mac | awk '{print $2}' | sed 's/[()]//g') 有效。
  • @ThomasDevoogdt ,有时(取决于您的网络流量)ARP 缓存没有足够填充,并且不包括您正在搜索的 MAC 地址。
【解决方案2】:

我会简单地使用

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

【讨论】:

  • 昨晚有效,但今天无效。什么?我必须在这个命令之前运行nmap -sP xxx.xxx.xxx.0/24,然后它又工作了
  • 我认为它只是检查 ARP 缓存。
  • 这是现代 GNU/Linux 机器中的正确方法。更多信息:man ip-neighbour
  • 超级,但记住 MAC 区分大小写(gentoo)
  • @caligari 甚至没有显示完整列表。有几个 IP 没有列出,我绝对确定它们在那里。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    你可以试试arp命令,按mac地址grep

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

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

    【讨论】:

    • 如果两个接口具有不同的网络并且每个接口有 2 个不同的 ip 记录怎么办?哪一个是活跃的?
    • arp -a 只显示缓存中的内容。所以你需要先使用 arp-scan 或 nmap。另外,请参阅上面的评论。
    【解决方案5】:

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

    【讨论】:

    • ethip.getip('00:1E:C9:56:3C:8E', '10.5.42.255') 给出了一个EOFError,但没有关于 ARP 的信息。一旦 ARP 获得了问题设备的详细信息,ethip.getip() 就可以正常工作。有没有办法不用每次都更新ARP表来获取ip地址
    • @Blue 它必须以 root 权限运行。你需要 root 才能发送 arp 请求,afaik
    【解决方案6】:

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

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

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

      • 我没有投反对票,但可能是因为单个广播域中的 60k+ 是个坏主意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多