¿Cómo puedo obtener la lista de todas las interfaces de red activas mediante programación?

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 -listallhardwareportslo 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 usar el scutilcomando para enumerar las interfaces de red activas con sus direcciones IPv4 y 6:scutil --nwi

Respuestas (2)

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 -listallhardwareportsmuestra 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 -listallhardwareportspara 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 -listallhardwareportsy |lo canalizo a través awkdel cual está buscando Hardware Port: Wi-Fiy usa la get linefunció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 en0y que se pasa ipconfig getifaddrcomo 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 stdoutejemplo 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 stdoutni 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.

Oh, gracias, pero estoy buscando una solución más basada en syscall/C....
si conoce el nombre de la interfaz, puede usar: ` ipconfig getifaddr en0`

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.

Es una buena práctica en AskDifferent proporcionar no solo enlaces, sino fragmentos importantes de las páginas a las que hace referencia. Con demasiada frecuencia, los enlaces mueren y su respuesta pierde su valor sin contexto. Siéntase libre de copiar y pegar líneas esenciales de código e información de fondo, siempre que se atribuya correctamente.