Mi objetivo es determinar la dirección IP para Ethernet en un dispositivo. Pero suponiendo que hay conexiones como WiFi y USB Ethernet, ¿hay alguna forma particular de obtener la IP de Ethernet?
En un shell, haría networksetup -listallhardwareports
lo que me daría una asignación de puerto de hardware a dispositivo. A partir de eso, buscaría en el dispositivo Puerto de hardware: Ethernet y luego usaría la estructura ifaddr para obtener mi IP.
Conozco la parte ifaddr, sugiera cómo hacer la primera parte mediante programación. Además, ¿hay un enfoque alternativo?
Puede haber varias formas diferentes de lograr lo que está pidiendo, sin embargo, simplemente descartaré esto.
Tengo una MacBook Pro que no tiene un puerto Ethernet incorporado, por lo que en mis ejemplos usaré Puerto de hardware: Wi-Fi, ya que probé esto en los dos ejemplos a continuación y funcionó, sin embargo, puede cambiarlo a Puerto de hardware : Ethernet si eso es lo que networksetup -listallhardwareports
muestra la salida de.
Si solo desea enviar la dirección IP del dispositivo de destino a stdout
, use el siguiente ejemplo:
$ ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}')
192.168.1.100
Si desea asignarlo a una variable en un script , use el siguiente ejemplo:
ipAddress="$(ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}'))"
Explicación:
La salida relevante de networksetup -listallhardwareports
para mi sistema es:
Hardware Port: Wi-Fi
Device: en0
Ethernet Address: 28:cf:e3:10:a4:cd
(Nota: esa no es mi dirección MAC real)
Usando $(...)
la sustitución de comandos para tener algo que pasar, ipconfig getifaddr <args>
determino el nombre del dispositivo del puerto de hardware con la salida networksetup -listallhardwareports
y |
lo canalizo a través awk
del cual está buscando Hardware Port: Wi-Fi
y usa la get line
función, que lee la siguiente línea después de la coincidencia y se pasa a print $2
, que en esencia imprime la segunda parte de la línea que sigue a match , que en el caso es en0
y que se pasa ipconfig getifaddr
como su argumento en el primer ejemplo, por ejemplo ipconfig getifaddr en0
. La salida de la cual es la dirección IP.
En el segundo ejemplo, se usa una segunda $(...)
sustitución de comando alrededor de la línea de comando compleja utilizada para el stdout
ejemplo para asignarla a la ipAddress
variable cuando se usa en un script .
Nota: Esto realmente pretende ser un ejemplo, ya que no lo he codificado para tener en cuenta que el dispositivo está inactivo. En otras palabras, si el dispositivo no tiene una dirección IP, no habrá salida stdout
ni nada asignado a la ipAddress
variable en el script . Aunque en el script se puede codificar para probar si la ipAddress
variable está vacía o no y actuar en consecuencia.
Use SCNetworkInterfaceCopyAll para obtener una lista de interfaces, luego filtre las que no devuelven Ethernet con SCNetworkInterfaceGetInterfaceType . Desde allí, puede obtener la puerta de enlace y la máscara, etc. En python, uso netifaces para eso.
Pierz
scutil
comando para enumerar las interfaces de red activas con sus direcciones IPv4 y 6:scutil --nwi