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

4

Mi objetivo es determinar la dirección IP para Ethernet en un dispositivo. Pero suponiendo que haya conexiones como WiFi y USB Ethernet, ¿hay alguna forma particular de obtener la IP de Ethernet?

En un shell haría: networksetup -listallhardwareports

que me daría una asignación de puerto de hardware a dispositivo. A partir de eso, obtendría el dispositivo para Puerto de hardware: Ethernet y luego utilizaría la estructura ifaddr para obtener mi IP.

Sé que la parte ifaddr, por favor sugiera cómo hacer la primera parte mediante programación. Además, ¿hay un enfoque alternativo?

    
pregunta user447851 10.02.2016 - 06:09

2 respuestas

4

Puede haber varias formas diferentes de lograr lo que estás pidiendo, sin embargo, solo lanzaré esto por ahí.

Tengo un MacBook Pro que no tiene un puerto Ethernet incorporado, así 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 muestra la salida de
networksetup -listallhardwareports para usted.

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)

Uso de la sustitución del comando $(...) 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 usa la función get line , que lee la siguiente línea después de match y se pasa a print $2 , que en esencia imprime la segunda parte de la línea que sigue a la match , 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, se usa una segunda sustitución de comando $(...) alrededor de la línea de comando compleja utilizada para el ejemplo stdout para asignarla a la variable ipAddress cuando se usa en un script .

Nota: esto realmente debe ser un ejemplo, ya que no lo he codificado para tener en cuenta que el dispositivo está apagado. En otras palabras, si el dispositivo no tiene una dirección IP, no habrá salida para stdout y no se asignará nada a la variable ipAddress en el script . Aunque en el script se puede codificar para probar si la variable ipAddress está vacía y actúa en consecuencia.

    
respondido por el user3439894 10.02.2016 - 07:32
1

Use SCNetworkInterfaceCopyAll para obtener una lista de interfaces, luego filtre las que no regresan Ethernet con SCNetworkInterfaceGetInterfaceType . Desde allí puede obtener la puerta de enlace y la máscara, etc. En Python, uso netifaces para eso.

    
respondido por el totaam 03.06.2018 - 18:54

Lea otras preguntas en las etiquetas