Моя цель - определить IP-адрес для Ethernet на устройстве. Но если предположить, что есть такие соединения, как WiFi и USB Ethernet, есть ли какой-то особый способ получить IP-адрес Ethernet?
В оболочке я бы сделал networksetup -listallhardwareports
, что дало бы мне сопоставление аппаратного порта с устройством. Исходя из этого, я бы нашел устройство для аппаратного порта: Ethernet, а затем использовал структуру ifaddr, чтобы получить свой IP-адрес.
Я знаю часть ifaddr, подскажите, пожалуйста, как сделать первую часть программно. Кроме того, есть ли альтернативный подход?
Может быть несколько разных способов выполнить то, о чем вы просите, однако я просто выброшу это.
У меня есть MacBook Pro, у которого нет встроенного порта Ethernet, поэтому в своих примерах я буду использовать аппаратный порт: Wi-Fi, так как я тестировал это в обоих примерах ниже, и это сработало, однако вы можете изменить его на аппаратный порт . : Ethernet, если это то, что показывает вывод networksetup -listallhardwareports
для вас.
Если вы просто хотите вывести IP-адрес целевого устройства в stdout
, используйте следующий пример:
$ ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}')
192.168.1.100
Если вы хотите присвоить его переменной в скрипте , используйте следующий пример:
ipAddress="$(ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}'))"
Объяснение:
Соответствующий вывод networksetup -listallhardwareports
для моей системы:
Hardware Port: Wi-Fi
Device: en0
Ethernet Address: 28:cf:e3:10:a4:cd
(Примечание: это не мой реальный MAC-адрес)
Используя $(...)
подстановку команд, чтобы иметь что-то для передачи, ipconfig getifaddr <args>
я определяю имя устройства аппаратного порта с выводом networksetup -listallhardwareports
и передаю |
его через awk
который ищет Hardware Port: Wi-Fi
и использует get line
функцию, которая читает следующую строку после совпадения и передается в print $2
, который в Essence печатает вторую часть строки после match , которая в данном случае есть en0
и передается ipconfig getifaddr
в качестве аргумента в первом примере, например ipconfig getifaddr en0
. Результатом которого является IP-адрес.
$(...)
Во втором примере используется вторая подстановка команд вокруг сложной командной строки, используемой в stdout
примере, чтобы присвоить ее переменной ipAddress
при использовании в сценарии .
Примечание. Это действительно должно быть примером, поскольку я не закодировал его для учета отказа устройства. Другими словами, если у устройства нет IP-адреса, не будет вывода stdout
и ничего не будет назначено ipAddress
переменной в скрипте . Хотя в скрипте можно закодировать, чтобы проверить, пуста ли ipAddress
переменная , и действовать соответственно.
Используйте SCNetworkInterfaceCopyAll, чтобы получить список интерфейсов, затем отфильтруйте те, которые не возвращают Ethernet, с помощью SCNetworkInterfaceGetInterfaceType . Оттуда вы можете получить шлюз, маску и т. д. В питоне я использую для этого нетифейсы .
Пирс
scutil
команду для вывода списка активных сетевых интерфейсов с их адресами IPv4 и 6:scutil --nwi