4 votos

Determinar un valor de índice de SSIDs en la lista de redes preferidas

Estoy buscando una manera de utilizar el MacOS networksetup (y un poco de mojo de filtrado de cadenas/líneas) para sacar todos los SSID de las Redes Preferidas, y luego determinar en qué índice se encuentra el SSID de mi cuerpo (y luego actuar dependiendo del valor del índice que tenga).

Ejemplo:

admin@mac1 ~ % networksetup -listpreferredwirelessnetworks en0
Preferred networks on en0:
    Denny's
    Hipster Cafe
    Hilton Hotels
    My_Mom's_Basement
    Airport
    Marriot - Public-5G
    HOME-OFFICE

Verá que cada línea muestra un SSID. 'Denny's' está en el índice 0 (superior) y, por tanto, es el SSID prioritario.

Del mismo modo, verás que mi red corporativa ('HOME-OFFICE') está en la parte inferior (índice 7 de 7).

¿Cómo puedo obtener el valor del índice utilizando un shell script? He intentado analizar la salida y luego construir/filtrar/aplicar una lista usando herramientas como wc, grep, etc. pero no he conseguido la lógica correcta hasta ahora.

Ya tengo la lógica para mover mi SSID corporativo al índice 0, pero sólo quiero ejecutar esa lógica si el SSID 'HOME-OFFICE' NO está ya en el índice 0 - lo que parece que no puedo averiguar.

0 votos

¿Por qué hay que cambiar la prioridad? ¿Por qué por scriot en lugar de arrastrarlos a un nuevo orden? ¿Alguno de ellos está al alcance de otro? Si no es así, se elegirá la primera disponible en la lista.

0 votos

Encontré este artículo en el aplicación para el aeropuerto que podría ayudar.

1voto

staffan Puntos 3299

Formular el problema en términos de "¿qué índice tiene mi red corporativa?" complica el problema. Como sólo quieres saber si está en el primer puesto de la lista, basta con comprobar si el primer puesto de la lista es tu red corporativa.

Zsh

Aquí hay una manera de poner los nombres de red en un array en zsh. Esto utiliza tres anidados expansión de parámetros construye alrededor de una sustitución de comandos:

  • ${(f)$(…)} divide la salida de la sustitución del comando en líneas ( f bandera ).
  • ${(@)…##[[:space:]]##} quita el prefijo que coincide con el patrón [[:space:]]## , lo que significa uno o más caracteres de espacio en blanco. ( [[:space:]]# , es decir, cero o más caracteres de espacio en blanco, sería equivalente, ya que eliminar una cadena vacía no tiene ningún efecto). El objetivo es eliminar el tabulador inicial. ${(@)…#$'\t'} también funcionaría, pero sería frágil en caso de que una versión diferente de MacOS utilice una cantidad diferente de espaciado. El patrón necesita setopt extended_glob que está desactivado por defecto. La página web @ garantiza que los datos se procesen como una lista de cadenas (lista de líneas del paso anterior) y no como una sola cadena.
  • "${(@)…[2,-1]}" selecciona los elementos de la matriz desde el segundo (las matrices de zsh comienzan en 1) hasta el último (-1). Esto elimina la línea "Redes preferidas en ". El @ garantiza que cada línea termine en un elemento de matriz distinto. Las comillas dobles garantizan que los espacios dentro de un nombre de red no hagan que cada palabra de un nombre termine en un elemento de matriz separado.

    setopt extended_glob networks=("${(@)${(@)${(f)$(networksetup -listpreferredwirelessnetworks en0)}##[[:space:]]##}[2,-1]}")

Ahora puedes comprobar si el primer elemento es el que quieres:

if [[ $networks[1] != "HOME-OFFICE" ]]; then
  …
fi

Si desea el índice (basado en 1) de un nombre de red, puede utilizar la función i bandera de subíndice del array .

echo $networks[(i)"HOME-OFFICE"]

Sed

Puede utilizar sed para extraer una línea específica por número. Los números de línea empiezan por el 1. Utilice el botón -n para suprimir la impresión y el p para imprimir la línea deseada, o utilice el comando d para eliminar todas las líneas excepto la deseada. Utilice el comando s para eliminar los espacios en blanco iniciales; tenga en cuenta que hay un carácter de tabulación literal y un espacio dentro de los corchetes. Puede añadir el sufijo p a la s para imprimir su salida sin un p comando.

preferred_network=$(networksetup -listpreferredwirelessnetworks en0 | sed -n '2s/^[  ]*//p')

o

preferred_network=$(networksetup -listpreferredwirelessnetworks en0 | sed -n '2!d; s/^[  ]*//')

Puedes obtener el índice basado en 2 de un elemento por su nombre con sed aplicando la función = a la(s) línea(s) que coincida(n) con una expresión regular.

line_number=$(networksetup -listpreferredwirelessnetworks en0 | sed -n 's/^[     ]*//; /^HOME-OFFICE$/=')
zero_based_index=$((line_number - 2))

Awk

Puede utilizar awk para extraer una línea específica por número. Los números de línea comienzan en 1, y el número de la línea actual está en el NR variable. Después de la búsqueda de la línea deseada, elimine el espacio en blanco inicial con la tecla sub y luego print la línea. Awk reconoce \t para significar un carácter de tabulación.

preferred_network=$(networksetup -listpreferredwirelessnetworks en0 | awk 'NR==2 {sub(/^[\t ]*/, ""); print}')

Si quiere el número de una línea con un contenido específico, puede hacer coincidir la línea con una expresión regular o haciendo una comparación de cadenas ( $0 contiene toda la línea sin un carácter de terminación de línea nueva), entonces imprime NR .

home_office_zero_based_index=$(networksetup -listpreferredwirelessnetworks en0 | awk '{sub(/^[\t ]*/, "")} $0 == "HOME-OFFICE" {print NR - 2})'

o

home_office_zero_based_index=$(networksetup -listpreferredwirelessnetworks en0 | awk '/^[\t ]HOME-OFFICE$/ {print NR - 2})'

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