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.
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.
źródło