Невозможно получить все сетевые интерфейсы с помощью NetworkInterface.getNetworkInterfaces в Linux

#java #linux #networking

#java #linux #сеть

Вопрос:

Мне нужно распечатать все mac-адреса моей машины. Рекомендуемый способ — использовать NetworkInterface.getNetworkInterfaces() и выполнить итерацию по возвращенному перечислению. Однако, когда некоторые устройства не работают (IP не настроен), вышеуказанный метод не вернет интерфейсы.

Запуск «ip addr» вернет следующее

  1. lo: mtu 16436 qdisc без очереди / обратной связи 00:00:00:00:00:00 брд 00:00:00:00:00:00 inet 127.0.0.1/8 хост области действия lo inet6 ::1/128 хост области действия valid_lft навсегда предпочтительный_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:ff
  3. G1: mtu 1500 qdisc pfifo_fast qlen 1000 ссылка / эфир 00:03: b2:75:99: c3 brd ff: ff: ff: 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 область действия ссылка действительна_lft навсегдапредпочтительный_lft навсегда
  4. eth2: mtu 1500 qdisc noop qlen 1000 link / ether 00:03:b2:75:99:c4 brd ff: 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: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("X%s", mac[i], (i < mac.length - 1) ? ":" : ""));
         }
         System.out.println(macAddress.toString());
}
}
  

Вывод: 00:03: B2:75:99: C3 (только для G1).

Я действительно хочу чисто Java-решение, если это возможно.
Есть мысли?

Комментарии:

1. Найдено сообщение об ошибке openjdk: bugs.openjdk.java.net/browse/JDK-8147071

Ответ №1:

Похоже, что «ip addr» показывает все сетевые адаптеры, но не все настроены с интернет-адресом. Таким образом, Java возвращает только сетевые интерфейсы, то есть настроенные адаптеры.

Комментарии:

1.Это именно моя точка зрения. Java должна возвращать все адаптеры независимо от того, настроены они или нет, и пусть разработчик решает, как с этим продолжить. Я думаю, что документ Java ошибочен в этом: возвращает все интерфейсы на этом компьютере. Возвращает null, если на этом компьютере не удалось найти сетевые интерфейсы. ПРИМЕЧАНИЕ: можно использовать getNetworkInterfaces() getInetAddresses() для получения всех IP-адресов для этого узла

2. Есть сетевая карта / адаптер (аппаратное устройство), есть сетевой интерфейс (логическое подключение через сетевую карту). Кроме того, вы можете назначить несколько интерфейсов с помощью одной карты. Итак, javadoc верен, он возвращает интерфейсы. Я подозреваю, что нет простого способа перечислить все карты с помощью java, вероятно, вам придется использовать некоторые собственные материалы.