查询 ARP 缓存以获取 MAC ID

2022-09-04 06:21:40

我需要获取网络中主机的 MAC ID。为此,如果我ping到该IP并查询ARP缓存,我能够获得MAC ID。我只是想知道我是否可以获取任何API来查询ARP并获取MAC ID。arp -a

另外,如果有更好的方法从IP地址获取MAC ID,请建议。

P.S:我在JAVA工作。

谢谢。


答案 1

Java没有提供直接的方法来查询网络中主机的MAC地址,因为这是由Java的套接字库抽象出来的。

在某种程度上,这是有道理的,因为主机的MAC地址实际上说得很少。没有主机的“MAC地址”这样的东西。

  • 许多主机将有多个 NIC,所有这些 NIC 都有一个单独的 MAC 地址,通过这些 NIC 可以连接到网络。我目前使用的计算机有一个有线以太网适配器,一个WiFi适配器和一个Firewire适配器,它们都有自己的MAC地址。这意味着主机没有明确的 MAC 地址。
  • 如果主机位于不同的子网上,ARP 实际上会为您提供数据包通过的最后一个路由器的 MAC 地址,而不是您正在扫描的主机的 MAC 地址。

将这两个问题放在一起,这意味着一个主机可能具有许多不同的MAC地址(如果它具有多个NIC),并且一个MAC地址可能代表许多不同的主机(如果流量通过路由器)。

假设您知道所有这些,并且仍然需要获取主机的MAC地址,那么在Java中执行此操作的唯一方法是“本机”:

  • 运行程序的客户端的本机:
    • 您可以启动 ARP 命令行工具并解析其输出。
    • 您可以使用某种 JNI 调用。不过,我对JNI不太熟悉,所以我不能帮你。
    • 编写一个单独的小型本机应用程序,您可以通过 Telnet 或某些此类协议从 Java 访问该应用程序,该应用程序将为您运行 ARP 命令。
  • 要扫描的主机的本机:
    • 您可以使用SNMP,正如此线程的其他一些答案所暗示的那样。我尊重这些答案,让它为你工作。SNMP 是一个很好的协议,但请注意,SNMP 的 OID 既依赖于平台,也可以依赖于供应商。适用于Windows的OID并不总是适用于Linux,反之亦然。
    • 如果您知道主机运行的是 Windows,则可以使用 WMIWin32_NetworkAdapter类保存所需的信息,但请注意,这将返回所有主机 NIC,甚至是 Windows 构成的主机 NIC。此外,它还需要您正在扫描的主机的管理员凭据。Google会告诉你如何从Java连接到WMI。
    • 如果您知道主机运行的是 OS X,则可以通过 SSH 连接到计算机并解析命令的输出。system_profile
    • 对于Linux,可能存在类似于OS X的工具。system_profile

答案 2

有一种更简单的方法:

private static final String ARP_GET_IP_HW = "arp -a";

public String getARPTable(String cmd) throws IOException {
           Scanner s = new Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A");
                return s.hasNext() ? s.next() : "";
    }

System.out.println(getARPTable(ARP_GET_IP_HW ));

您将获得在每行上排序的IP和HW的eintier ARP表。

然后,您可以将表拆分为单独的 String 行,并在每行上使用正则表达式来匹配 HW 和 IP 地址。大功告成。


推荐