0 votos

Acceso programado para conectarse a una red wifi

Muy similar a esta pregunta , pero como me animó a hacer mi @bmike quería volver a plantear esta pregunta ya que no era un duplicado de Crear una red AirPort desde la línea de comandos .

Estoy buscando una forma programática de conectarme a una red wifi. Puede ser guardado (recordado) o desconocido, preferiblemente en Apple script o vía Automator.

Lo he hecho en un PC con Windows a través del siguiente comando:

netsh wlan add profile wifi.xml user=current

(creándola, como única red wifi disponible, intentaría conectarse a ella)

El verdadero problema que tengo es: tengo un Mac Book, OSX 10.10, compartido por dos usuarios. Un usuario debería poder acceder (y preferiblemente conectarse por defecto) al SSID "Wifi1" y el segundo usuario debería poder acceder al SSID "Wifi2", pero ninguno de los dos usuarios debería conectarse al wifi del otro. El Windows netsh wlan con opción user=current logra esto pero no veo que esto sea soportado en un Mac.

Desactivar el recuerdo del SSID, y hacer que los usuarios escriban la contraseña cada vez, por supuesto que lograría este objetivo, pero estoy buscando una solución más automatizada.

No he encontrado la manera de lograrlo a través de las preferencias, las prioridades de wifi, recordar las redes o cualquier otra cosa.

También hay que tener en cuenta que el Cambio Rápido de Usuario está habilitado (esto parece dificultar la creación de scripts en mi investigación porque no hay un disparador o evento fiable al que escuchar para que se ejecute el script).

1voto

William T Froggard Puntos 2862

Esto debería servir, aunque puede necesitar alguna modificación. Cada vez que un usuario cambia, se crea una entrada en el registro del sistema. Sabiendo esto, puedes monitorear los cambios de usuario sin esfuerzo:

global wifi_device
on run
    set wifi_device to do shell script "networksetup -listallhardwareports|grep -A1 'Wi-Fi'|grep Device|sed 's;Device: ;;'"
end run
on idle
    set user_name to do shell script "tail -n0 -f /var/log/system.log|grep -om1 'context values set for .*'|sed -e 's;context values set for ;;'"
    if user_name is equal to "presaccount" then
        do shell script "networksetup -setairportnetwork " & wifi_device & " presaccount_network password"
    else if user_name is equal to "other_account" then
        do shell script "networksetup -setairportnetwork " & wifi_device & " other_account_network password"
    end if
    return 1
end idle

Sólo tienes que cambiar los nombres de red, las contraseñas y los nombres de cuenta por los que necesites.

Básicamente, estamos comprobando la entrada de registro que contiene "valores de contexto establecidos para", que se produce en cada interruptor, y contiene el nombre de usuario cambiado a. Usamos este nombre de usuario para determinar a qué red nos unimos, ¡y eso es todo! Yo recomendaría sólo permitir a los administradores cambiar la red wifi en las preferencias del sistema. Esto en realidad no utiliza casi ningún recurso, porque el script no puede continuar más allá de la primera línea, hasta que un usuario cambie. Hay que tener en cuenta que esto se hizo en 10.11. No puedo verificar si la entrada de registro está presente en 10.10, así que YMMV. Tendrá que guardar esto como una aplicación abierta en script Editor.

0voto

klanomath Puntos 19587

Mi idea (basada en este ) es un poco diferente a la de William.

No funciona con Cambio rápido de usuario pero tal vez uno podría usar partes del material de William para mezclarlo.

Este shell script debe colocarse en el ejecutable /usr/local/bin y con el propietario Root. Las diferentes ubicaciones (en Preferencias de Red) deben tener los nombres de los usuarios y deben ser configuradas/pobladas. También hay que configurar los nombres propios del usuario1/2 y el SSID1/2. También puede necesitar algunas otras mejoras/modificaciones.

#!/bin/bash

# automatically change location and ssid based on user

# redirect all IO to /dev/null (comment this out if you want to debug)
# exec 1>/dev/null 2>/dev/null

# get a little breather before we get data for things to settle down
sleep 2

# get/set various system information
DEVICEEN="networksetup -listallhardwareports|grep -A1 'Wi-Fi'|grep Device|sed 's;Device: ;;'"
CURRENT_USER=$USER
SSID1=wifi1
SSID2=wifi2

# basic pattern matching to get all location names separated by newlines
LOCATION_NAMES=`scselect | tail -n +2 | cut -d "(" -f 2 | cut -d ")" -f 1`
CURRENT_LOCATION=`scselect | grep " \* " | cut -d "(" -f 2 | cut -d ")" -f 1`

# no brackets as the grep will return a status code depending on whether the SSID has an own Location
if echo "$LOCATION_NAMES" | egrep -q "^$CURRENT_USER$"; then
  NEW_LOCATION="$CURRENT_USER"
else
  # auto does not seem to be working on Mac OS X Lion, but Automatic does
  if echo Automatic | grep -q "$LOCATION_NAMES"; then
    NEW_LOCATION=Automatic
  elif echo auto | grep -q "$LOCATION_NAMES"; then
    NEW_LOCATION=auto
  else
    echo "Automatic location was not found!"
    echo "The following locations are known:"
    echo "$LOCATION_NAMES"
  fi
fi

if [ "x$NEW_LOCATION" != "x" -a "x$NEW_LOCATION" != "x$CURRENT_LOCATION" ]; then
    echo "Changing to $NEW_LOCATION"
    scselect "$NEW_LOCATION"
fi

if [ "$NEW_LOCATION" = "user1" ]; then
    echo "Changing to $SSID1"
    networksetup -setairportnetwork "$DEVICEEN" "$SSID1"
elif [ "$NEW_LOCATION" = "user2" ]; then
    echo "Changing to $SSID2"
    networksetup -setairportnetwork "$DEVICEEN" "$SSID2"
else
    echo "SSID was not found!"
fi

El shell script tiene que ser iniciado por un plist de agente de lanzamiento en /Users/$User/Library/LaunchAgents.

Configurar networksetup -setairportnetwork en1 "$SSID1/2" no me funciona correctamente. Esto podría solucionarse desactivando el recuerdo del SSID y añadiendo la contraseña del Wi-Fi en el networksetup... comandos.

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