22 votos

¿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 una manera particular sólo para obtener la IP de Ethernet?

En una concha lo haría: networksetup -listallhardwareports

lo que me daría un mapeo de Puerto de Hardware a Dispositivo. A partir de eso, buscaría en el dispositivo el Puerto de Hardware: Ethernet y luego usaría la estructura ifaddr para obtener mi IP.

Conozco la parte de ifaddr, por favor sugiera como hacer la primera parte programáticamente. Además, ¿hay un enfoque alternativo?

25voto

user3439894 Puntos 5883

Puede haber varias maneras diferentes de lograr lo que estás pidiendo, sin embargo, sólo voy a lanzar esto por ahí.

Tengo un MacBook Pro que no tiene puerto Ethernet integrado, así que en mis ejemplos utilizaré Puerto de hardware: Wi-Fi ya que lo he probado en los dos ejemplos de abajo y ha funcionado, sin embargo puedes cambiarlo por Puerto de hardware: Ethernet si es que la salida de
networksetup -listallhardwareports espectáculos para usted.

Si sólo desea imprimir la dirección IP del dispositivo de destino en stdout Utiliza el siguiente ejemplo:

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

Si quiere asignarlo a un variable en un script Utiliza el siguiente ejemplo:

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

Explicación:

La salida pertinente de networksetup -listallhardwareports para mi sistema es:

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

(Nota: Esta no es mi verdadera dirección MAC)

Utilizando $(...) sustitución de comandos para tener algo que pasar a ipconfig getifaddr <args> Determino el Nombre del Dispositivo del Puerto de Hardware con la salida de networksetup -listallhardwareports y la tubería | a través de awk que busca Hardware Port: Wi-Fi y utiliza el get line que lee la siguiente línea después de la coincide con y se pasa a print $2 que, en esencia, imprime la segunda parte de la línea que sigue al coincide con que en el caso es en0 y que se pasa a 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, un segundo $(...) se utiliza alrededor de la compleja línea de comandos utilizada para el stdout ejemplo para asignarlo al ipAddress variable cuando se utiliza en un script .

Nota: Esto es realmente un ejemplo, ya que no lo he codificado para tener en cuenta que el dispositivo no funciona. En otras palabras, si el dispositivo no tiene una dirección IP no habrá salida para stdout y nada asignado al ipAddress variable en el script . Aunque en el script se puede codificar para comprobar si el ipAddress variable está vacío y actuar en consecuencia.

0voto

totaam Puntos 119

Utilice SCNetworkInterfaceCopyAll para obtener una lista de interfaces, y luego filtrar las que no devuelven Ethernet con SCNetworkInterfaceGetInterfaceType . Desde ahí puedes obtener la puerta de enlace y la máscara, etc - en Python uso netifaces por eso.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X