一尘不染

查询ARP缓存以获取MAC ID

java

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

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

PS:我在JAVA工作。

谢谢。


阅读 518

收藏
2020-09-08

共1个答案

一尘不染

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

从某种意义上说,这很有意义,因为主机的MAC地址实际上很少说。没有诸如主机的“ the” MAC地址之类的东西。

  • 许多主机将具有多个NIC,所有NIC都具有单独的MAC地址,通过它们它们可以连接到网络。目前,我使用的计算机具有有线以太网适配器,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,则可以使用WMI。该Win32_NetworkAdapter类拥有你想要的信息,但要注意,这将返回 所有 的主机网卡,即使是那些视窗组成。另外,它还需要您要扫描的主机的管理员凭据。Google会告诉您如何从Java连接到WMI。
    • 如果知道主机运行OS X,则可以通过SSH进入计算机并解析system_profile命令的输出。
    • 对于Linux,system_profile可能存在类似于OS X的工具。
2020-09-08