2 votos

¿Cómo obtener el nombre del dispositivo Wi-Fi de MacOS mediante programación en Bash script?

bash% networksetup -listnetworkserviceorder
An asterisk (*) denotes that a network service is disabled.
(1) SAMSUNG Modem
(Hardware Port: Modem (SAMSUNG_MDM), Device: SAMSUNG_MDM)

(2) Ethernet
(Hardware Port: Ethernet, Device: en0)

(3) FireWire
(Hardware Port: FireWire, Device: fw0)

(4) Wi-Fi
(Hardware Port: Wi-Fi, Device: en1)

(5) Bluetooth PAN
(Hardware Port: Bluetooth PAN, Device: en2)

Esto es bueno para la lectura, pero ¿cómo puedo obtener 'en1' programáticamente en un Bash script para que pueda utilizar el nombre del dispositivo en un trabajo cron?

4voto

user3439894 Puntos 5883

En su pregunta sé que utilizó networksetup -listnetworkserviceorder sin embargo yo usaría networksetup -listallhardwareports ya que es más fácil analizar la salida utilizando awk por sí mismo, con un mínimo de codificación para evitar múltiples tubos utilizando otros comandos como se ofrece en la otra respuesta y debería ser lo suficientemente robusto como para producir una salida consistente hasta que Apple cambie el formato de salida de networksetup -listallhardwareports si es que alguna vez lo hacen.

Como ejemplo en mi sistema, networksetup -listallhardwareports muestra lo siguiente:

$ networksetup -listallhardwareports

Hardware Port: Bluetooth DUN
Device: Bluetooth-Modem
Ethernet Address: N/A

Hardware Port: Display Ethernet
Device: en3
Ethernet Address: xx:xx:xx:xx:xx:xx

Hardware Port: Display FireWire
Device: fw0
Ethernet Address: xx:xx:xx:xx:xx:xx

Hardware Port: Wi-Fi
Device: en0
Ethernet Address: xx:xx:xx:xx:xx:xx

Hardware Port: Bluetooth PAN
Device: en2
Ethernet Address: N/A

VLAN Configurations
===================
$ 

Mirando las líneas relevantes de salida:

Hardware Port: Wi-Fi
Device: en0

La forma más fácil de conseguir en0 en este ejemplo es:

networksetup -listallhardwareports | awk '/Wi-Fi/{getline; print $2}'

Se puede asignar a una variable:

wifiDevice="$(networksetup -listallhardwareports | awk '/Wi-Fi/{getline; print $2}')"

A continuación, puede utilizar $wifiDevice más adelante en el script para representar en0 en este ejemplo.

Obviamente en su sistema, basado en la salida en su pregunta, $wifiDevice sería: en1


Si desea utilizar networksetup -listnetworkserviceorder puede utilizar awk por sí mismo, de esta manera:

networksetup -listnetworkserviceorder | awk '{gsub(/\)/, "")}/Wi-Fi, Device/{print $5}'

Sin embargo, yo utilizaría mi primer ejemplo en lugar de este.


Yo también evitaría utilizar system_profiler en este caso, ya que la salida tarda bastante más en generarse que cuando se utiliza networksetup .

0 votos

Buena respuesta, pero system_profiler no tarda más en generar la salida cuando se especifica el tipo de datos que se desea: system_profiler SPAirPortDataType Lo que lleva tiempo es cuando tiene que generar todos los tipos de datos.

0 votos

@Allan, no estoy hablando de correr system_profiler ¡sin discusión! Estoy comparando el tiempo real que se tarda en ejecutar networksetup -listallhardwareports vs. system_profiler SPAirPortDataType donde, por ejemplo, en mi sistema el primero es instantáneo en comparación con el segundo, 0m0.025s vs. 0m3.296s ¡! A ~ 130 veces más rápido, no hay duda y por eso hice el comentario.

1voto

Douglas Puntos 10417

Puede canalizar la salida grep awk y cut como opción:

networksetup -listnetworkserviceorder | grep -i "Wi-Fi, Device" | awk '{ print $5 }' | cut -c 1-3

También puede utilizar system_profiler para obtener información sobre tu adaptador AirPort:

system_profiler SPAirPortDataType

A continuación, puede de nuevo, la tubería de salida a través de grep para obtener su adaptador:

system_profiler SPAirPortDataType | grep Interfaces -A1

1 votos

No es terriblemente robusto; esperaba alguna función más incorporada con opciones para conseguirlo. Por ejemplo, el comportamiento de 'grep' en diferentes máquinas puede variar, haciendo que el siguiente comando de corte no siempre sea correcto.

3 votos

Ayúdame a entender esto - no sabes cómo conseguir esto en bash, pero sabes que no es lo suficientemente "robusto". ¿Qué es exactamente lo que quieres hacer porque ahora tu pregunta carece de detalles sustanciales. ¿Qué "función incorporada" te gustaría?

0 votos

En lugar de canalizar la salida de networksetup -listnetworkserviceorder primero en grep y luego a awk y luego a cut sólo tiene que utilizar awk para todo el proceso, por ejemplo networksetup -listnetworkserviceorder | awk '{gsub(/\)/, "")}/Wi-Fi, Device/{print $5}'

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