#java #linux #networking
#java #linux #сеть
Вопрос:
Мне нужно распечатать все mac-адреса моей машины. Рекомендуемый способ — использовать NetworkInterface.getNetworkInterfaces() и выполнить итерацию по возвращенному перечислению. Однако, когда некоторые устройства не работают (IP не настроен), вышеуказанный метод не вернет интерфейсы.
Запуск «ip addr» вернет следующее
- 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 навсегда
- G2: mtu 1500 qdisc pfifo_fast qlen 1000 link / ether 00:03:b2:75:99:c2 brd ff: ff: ff:ff:ff:ff:ff
- 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 навсегда
- eth2: mtu 1500 qdisc noop qlen 1000 link / ether 00:03:b2:75:99:c4 brd ff: ff: ff: ff:ff:ff:ff
- 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, вероятно, вам придется использовать некоторые собственные материалы.