Acceso programático para conectarse a una red wifi

0

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

Estoy buscando una forma programática de conectarse a una red wifi. Puede guardarse (recordarse) o desconocerse, preferiblemente en Apple Script o mediante Automator.

He hecho esto en una PC con Windows a través del siguiente comando:

netsh wlan add profile wifi.xml user=current

(crearlo, como la única red wifi disponible, intentaría conectarse a ella)

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

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

No he encontrado una forma de lograr esto a través de las preferencias, las prioridades de wifi, el recuerdo de redes o cualquier otra cosa.

También para tener en cuenta, el Cambio rápido de usuario está habilitado (esto parece dificultar las secuencias de comandos en mi investigación porque no hay un evento o evento confiable para escuchar para que se ejecute la secuencia de comandos).

    
pregunta mlhDev 18.01.2016 - 03:17

2 respuestas

1

Esto debería hacerlo, aunque puede necesitar alguna modificación. Cada vez que un usuario cambia, se crea una entrada de registro del sistema. Sabiendo esto, puede 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

Solo cambia los nombres de red, las contraseñas y los nombres de cuenta a lo que necesites que sean.

Básicamente, estamos comprobando la entrada del registro que contiene "valores de contexto establecidos para", que se produce en cada conmutador y contiene el nombre de usuario al que se cambió. Usamos este nombre de usuario para determinar a qué red unirse, y eso es todo. Recomiendo solo permitir que los administradores cambien la red wifi en las preferencias del sistema. En realidad, esto casi no utiliza recursos, ya que la secuencia de comandos no puede continuar más allá de la primera línea, hasta que un usuario cambia. Tenga en cuenta que esto se hizo en 10.11. No puedo verificar si la entrada de registro está presente en 10.10, entonces YMMV. Tendrás que guardar esto como una aplicación abierta en Script Editor.

    
respondido por el William T Froggard 18.01.2016 - 06:04
0

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

No funciona con Cambio rápido de usuario pero tal vez uno podría usar partes de las cosas de William para mezclarlas.

Este script de shell se debe colocar en / usr / local / bin ejecutable y propietario de la raíz. Las diferentes ubicaciones (en Preferencias de red) deben tener los nombres de los usuarios y deben estar configuradas / completadas. También deben configurarse los nombres propios de user1 / 2 y 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 script de shell debe ser iniciado por una lista de agentes de lanzamiento en / Usuarios / $ Usuario / Biblioteca / Agentes de lanzamiento.

La configuración de networksetup -setairportnetwork en1 "$SSID1/2" no funciona correctamente para mí. Esto podría resolverse deshabilitando el SSID recordando y agregando la contraseña de Wi-Fi en los comandos networksetup... .

    
respondido por el klanomath 18.01.2016 - 07:14

Lea otras preguntas en las etiquetas