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

时间:2011-10-05 12:03:52

标签: 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 forever preferred_lft forever
  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范围全球G1 inet6 fe80 :: 203:b2ff:fe75:99c3 / 64范围链接    valid_lft forever preferred_lft forever
  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
  6. 然而,当我运行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());
    }
    }
    

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

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

1 个答案:

答案 0 :(得分:1)

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