Jak programowo uzyskać listę wszystkich aktywnych interfejsów sieciowych?

5

Moim celem jest określenie adresu IP dla Ethernetu na urządzeniu. Ale zakładając, że istnieją połączenia takie jak WiFi i Ethernet Ethernet, czy istnieje jakiś szczególny sposób na uzyskanie Ethernet IP?

Na muszli zrobiłbym: networksetup -listallhardports

co dałoby mi mapowanie portu sprzętowego na urządzenie. Od tego będę grep urządzenie do portu sprzętowego: Ethernet, a następnie użyj ifaddr struct, aby uzyskać moje IP.

Znam część ifaddr, proszę zasugerować, jak programowo wykonać pierwszą część. Czy istnieje alternatywne podejście?

user447851
źródło

Odpowiedzi:

5

Może być kilka różnych sposobów osiągnięcia tego, o co pytasz, jednak po prostu to wyrzucę.

Mam MacBooka Pro, który nie ma wbudowanego portu Ethernet, więc w moich przykładach będę go używać Port sprzętowy: Wi-Fi odkąd przetestowałem to w obu przykładach poniżej i zadziałało, jednak możesz to zmienić Port sprzętowy: Ethernet jeśli to jest wyjście
networksetup -listallhardwareports pokazuje dla ciebie.

Jeśli chcesz tylko wyprowadzić adres IP urządzenia docelowego do stdout, użyj następującego przykładu:

$ ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}')
$ 192.168.1.100

Jeśli chcesz przypisać go do zmienna w scenariusz , użyj następującego przykładu:

ipAddress="$(ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}'))"


Wyjaśnienie:

Odpowiednie wyjście networksetup -listallhardwareports dla mojego systemu jest:

Hardware Port: Wi-Fi
Device: en0
Ethernet Address: 28:cf:e3:10:a4:cd

(Uwaga: to nie jest mój prawdziwy adres MAC)

Za pomocą $(...) podstawianie poleceń, aby mieć coś do przekazania ipconfig getifaddr <args> Określa nazwę urządzenia portu sprzętowego z wyjściem networksetup -listallhardwareports i fajka | to przez awk który szuka Hardware Port: Wi-Fi i używa get line funkcja, która odczytuje następną linię po znaku mecz i jest przekazywany do print $2, co w istocie drukuje drugą część linii po znaku mecz , co w tym przypadku jest en0 i to zostaje przekazane ipconfig getifaddr jako argument w pierwszym przykładzie, np ipconfig getifaddr en0. Wyjściem jest adres IP.

W drugim przykładzie drugi $(...) podstawianie komend jest używane wokół złożonej linii komend używanej dla stdout przykład, aby przypisać go do ipAddress zmienna gdy używany w scenariusz .

Uwaga: To naprawdę ma być przykładem, ponieważ nie zakodowałem go tak, aby był wyłączony. Innymi słowy, jeśli urządzenie nie ma i adres IP nie będzie wyjścia stdout i nic nie zostało przypisane do ipAddress zmienna w scenariusz . Chociaż w scenariusz może być zakodowany w celu sprawdzenia, czy ipAddress zmienna jest pusta i działa odpowiednio.

user3439894
źródło
2
Oh dzięki, ale szukam rozwiązania opartego na syscall / C ....
user447851
1

Posługiwać się SCNetworkInterfaceCopyAll aby uzyskać listę interfejsów, odfiltruj te, które nie wracają Ethernet z SCNetworkInterfaceGetInterfaceType . Stamtąd możesz uzyskać bramę i maskę, itp. - w Pythonie, którego używam sieci za to.

totaam
źródło
1
Najlepszą praktyką w AskDifferent jest dostarczenie nie tylko linków, ale ważnych fragmentów ze stron, do których się odwołujesz. Zbyt często linki umierają, a twoja odpowiedź staje się bezwartościowa bez kontekstu. Zapraszamy do kopiowania i wklej istotne linie kodu i informacje podstawowe, o ile są one prawidłowo przypisane.
IconDaemon