Accesso programmatico per connettersi a una rete wifi

0

Molto simile a questa domanda , ma come incoraggiato a fare il mio @ bmike volevo Fai questa domanda perché non era un duplicato di Crea rete AirPort dalla riga di comando .

Sto cercando un modo programmatico per connettersi a una rete wifi. Può essere salvato (ricordato) o sconosciuto, preferibilmente in Apple Script o tramite Automator.

L'ho fatto su un PC Windows tramite il seguente comando:

netsh wlan add profile wifi.xml user=current

(la creazione, come unica rete wifi disponibile, proverebbe a connettersi ad esso)

Il vero problema che sto avendo è: ho un Mac Book, OSX 10.10, condiviso da due utenti. Un utente dovrebbe essere in grado di accedere (e preferibilmente connettersi di default) a SSID "Wifi1" e il secondo utente dovrebbe essere in grado di accedere al SSID "Wifi2", ma nessuno degli utenti deve connettersi al wifi dell'altro utente. Il netsh wlan di Windows con l'opzione user=current lo raggiunge ma non lo vedo supportato su un Mac.

Disattivare la memorizzazione di SSID e il fatto che gli utenti digitino la password ogni volta, ovviamente raggiungerebbe questo obiettivo, ma sto cercando una soluzione più automatizzata.

Non ho trovato un modo per farlo attraverso le preferenze, le priorità wifi, il ricordo di reti o qualsiasi altra cosa.

Da notare anche che il Cambio rapido utente è abilitato (questo sembra rendere difficile lo scripting nella mia ricerca perché non c'è un trigger o un evento affidabile da ascoltare per l'esecuzione dello script).

    
posta mlhDev 18.01.2016 - 03:17
fonte

2 risposte

1

Questo dovrebbe farlo, anche se potrebbe essere necessario qualche modifica. Ogni volta che un utente cambia, viene creata una voce del registro di sistema. Sapendo questo, puoi monitorare facilmente gli switch utente:

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

Cambia semplicemente i nomi di rete, le password e i nomi degli account in base alle tue esigenze.

Fondamentalmente, stiamo controllando la voce del registro contenente "valori di contesto impostati per", che si verifica su ogni switch e contiene il nome utente impostato su. Usiamo questo nome utente per determinare a quale rete aderire, e il gioco è fatto! Raccomanderei solo di consentire agli amministratori di modificare la rete wifi nelle preferenze di sistema. Questo in realtà non utilizza quasi risorse, perché lo script non può continuare oltre la prima riga, fino a quando un utente non cambia. Tieni presente che ciò è stato fatto il 10.11. Non riesco a verificare se la voce del registro è presente su 10.10, quindi YMMV. Dovrai salvare questo come app di soggiorno in Script Editor.

    
risposta data 18.01.2016 - 06:04
fonte
0

La mia idea (basata su questo ) è leggermente diversa da quella di William.

Non funziona con Cambio rapido utente , ma forse si potrebbero usare parti delle cose di William per mescolarle.

Questo script di shell dovrebbe essere posto in / usr / local / bin eseguibile e proprietario root. Le diverse posizioni (in Preferenze di rete) devono avere i nomi degli utenti e devono essere configurate / popolate. Devono essere impostati anche i nomi propri dell'utente1 / 2 e SSID1 / 2. Potrebbe anche essere necessario qualche altro miglioramento / modifica.

#!/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

Lo script della shell deve essere avviato da un agente di avvio plist in / Users / $ User / Library / LaunchAgents.

L'impostazione di networksetup -setairportnetwork en1 "$SSID1/2" non funziona correttamente per me. Ciò potrebbe essere risolto disabilitando il SSID che ricorda e aggiungendo la password Wi-Fi nei comandi networksetup... .

    
risposta data 18.01.2016 - 07:14
fonte

Leggi altre domande sui tag