无法在Linux上获得NetworkInterface.getNetworkInterfaces的所有网络接口

Tal*_* G. 5 java linux networking

我需要打印机器的所有mac地址.建议的方法是使用NetworkInterface.getNetworkInterfaces()并迭代返回的枚举.但是,当某些设备关闭时(NO Ip已配置),则上述方法将不会返回接口.

运行"ip addr"将返回以下内容

  1. lo:mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8范围主机lo inet6 :: 1/128范围主机valid_lft永远是preferred_lft永远
  2. G2:mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:03:b2:75:99:c2 brd ff:ff:ff:ff:ff:ff
  3. G1:mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:03:b2:75:99:c3 brd ff:ff:ff:ff:ff:ff inet 10.205.191.123/16 brd 10.205.255.255 scope global G1 inet6 fe80: :203:b2ff:fe75:99c3/64范围链接valid_lft永远preferred_lft永远
  4. eth2:mtu 1500 qdisc noop qlen 1000 link/ether 00:03:b2:75:99:c4 brd ff:ff:ff:ff:ff:ff
  5. eth3:mtu 1500 qdisc noop qlen 1000 link/ether 00:03:b2:75:99:c5 brd ff:ff:ff:ff:ff:ff

但是,当我运行Java代码(即使是root或具有网络权限)时,我只获得了环回和G1接口.

这是我为测试目的编写的代码:

Enumeration<NetworkInterface> ni = NetworkInterface.getNetworkInterfaces();
while(ni.hasMoreElements()){
NetworkInterface nextElement = ni.nextElement();
byte[] mac = nextElement.getHardwareAddress();
if (mac != null) {
         StringBuffer macAddress = new StringBuffer();
         for (int i = 0; i < mac.length; i++) {
              macAddress.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? ":" : ""));
         }
         System.out.println(macAddress.toString());
}
}
Run Code Online (Sandbox Code Playgroud)

输出为:00:03:B2:75:99:C3(仅G1).

如果可能,我确实想要一个纯java解决方案.
有什么想法吗 ?

kan*_*kan 1

看起来“ip addr”显示了所有网络适配器,但并非所有适配器都配置了互联网地址。因此,Java 仅返回网络接口,即配置的适配器。