Avvia VPN configurata dalla riga di comando (OSX)


Risposte:


41

Per le versioni più recenti di macOS, è possibile utilizzare un comando molto semplice, come mostrato nelle risposte seguenti, ad esempio questo (dare un +1!).

Tutto quello che serve è:

 networksetup -connectpppoeservice "UniVPN"

L'unico problema è che non è possibile disconnettersi utilizzando questo comando.


Puoi anche utilizzare AppleScript per connetterti ai servizi VPN di tua scelta. Useremo le funzioni della shell, che sono disponibili dalla riga di comando, una volta caricate.

Aggiungi le funzioni seguenti al tuo ~/.bash_profileo ~/.profile(qualunque cosa tu usi).

Devi solo cambiare il nome della connessione VPN stessa, come appare nelle preferenze di rete . Ho usato la mia VPN universitaria qui.

inserisci qui la descrizione dell'immagine

Puoi anche cambiare i nomi delle funzioni, se vuoi farlo per altre. Potrebbe essere possibile abbreviarlo usando gli argomenti, ma funziona bene in questo modo. L'ho provato su Snow Leopard (ma anche Leopard e Lion dovrebbero funzionare).

Dopo aver aggiunto le funzioni, ricaricare il terminale e chiamarle con vpn-connecte vpn-disconnect, rispettivamente.


function vpn-connect {
/usr/bin/env osascript <<-EOF
tell application "System Events"
        tell current location of network preferences
                set VPN to service "UniVPN" -- your VPN name here
                if exists VPN then connect VPN
                repeat while (current configuration of VPN is not connected)
                    delay 1
                end repeat
        end tell
end tell
EOF
}

function vpn-disconnect {
/usr/bin/env osascript <<-EOF
tell application "System Events"
        tell current location of network preferences
                set VPN to service "UniVPN" -- your VPN name here
                if exists VPN then disconnect VPN
        end tell
end tell
return
EOF
}

Ho ottenuto questo tipo di lavoro inserendo backtick come nel codice di boulder_ruby. Comunque idealmente aspetterebbe un callback prima di tornare. Il mio obiettivo è quello di correre vpn-connect && git fetch && vpn-disconnect. Pensi che ci sia un modo per farlo?
Michael Forrest,

Buona idea. Ho aggiornato la mia sceneggiatura ... l'ho appena testata e sembra funzionare.
slhck,

1
Questo può essere ovvio, ma solo per la cronaca: sembra che tu abbia effettivamente bisogno di una sessione della GUI aperta perché funzioni. Quando eseguo l'accesso tramite SSH mentre è attiva una sessione GUI dello stesso utente su quella macchina e lo chiamo vpn-connect, viene lanciato syntax error: Expected end of line but found identifier. (-2741)ma dopo averlo convertito in un'applicazione con l'editor AppleScript e chiamando open vpn-connect.appfunziona. Tuttavia, se non vi è alcuna sessione GUI attiva di quell'utente, LSOpenURLsWithRole() failed with error -10810viene lanciata una chiamata quando lo si chiama tramite SSH.
Stefan Schmidt,

56

Puoi anche, almeno da Lion 1 , usare il comando scutil.

Ad esempio, se ho un servizio VPN chiamato "Foo", potrei connettermi tramite:

$ scutil --nc start Foo

Posso facoltativamente specificare un utente, una password e un segreto usando flag con gli stessi nomi:

$ scutil --nc start Foo --user bar --password baz --secret quux

Il servizio può essere disconnesso tramite:

$ scutil --nc stop Foo

Per una guida più dettagliata, puoi vedere la pagina man o eseguire:

$ scutil --nc help

Aggiornare

Aggiunta di uno script rapido al polling fino a quando non viene stabilita la connessione (in risposta al commento di Eric B.

#!/bin/bash

# Call with <script> "<VPN Connection Name>"

set -e
#set -x

vpn="$1"

function isnt_connected () {
    scutil --nc status "$vpn" | sed -n 1p | grep -qv Connected
}

function poll_until_connected () {
    let loops=0 || true
    let max_loops=200 # 200 * 0.1 is 20 seconds. Bash doesn't support floats

    while isnt_connected "$vpn"; do
        sleep 0.1 # can't use a variable here, bash doesn't have floats
        let loops=$loops+1
        [ $loops -gt $max_loops ] && break
    done

    [ $loops -le $max_loops ]
}

scutil --nc start "$vpn"

if poll_until_connected "$vpn"; then
    echo "Connected to $vpn!"
    exit 0
else
    echo "I'm too impatient!"
    scutil --nc stop "$vpn"
    exit 1
fi

Note:

  1. Non è chiaro quando questo comando è stato aggiunto a OSX, ce l'ho in Mavericks e l'utente Eric B. riferisce che funziona in Lion (10.7.5).

Ho appena provato questo in Lion (10.7.5) e funziona benissimo. Solo non documentato nelle pagine man. Grazie!
Eric B.

Qualche attesa per ottenere che scutil attenda fino al completamento della connessione prima di tornare? Devo eseguire uno script una volta stabilita la connessione, ma scutil ritorna troppo rapidamente e il seguente comando viene eseguito prima che venga stabilita la connessione.
Eric B.

@EricB. Vedi i miei aggiornamenti per uno script veloce.
codificato il

L'opzione username dovrebbe essere --user, non--username
Rockallite,

2
Qualche idea sul perché scutil --nc stop Foonon funziona (su Yosemite)?
fdot,

26

Non l'ho provato sotto Lion ma sto usando il seguente comando sotto Mountain Lion senza alcun problema:

networksetup -connectpppoeservice UniVPN

Questo dovrebbe funzionare, questa utility è stata aggiunta nel '02.
El Developer

2
Sì, sorprendentemente questo approccio funziona anche se lo switch non è per i servizi VPN ma per i servizi PPPoE, ma la disconnessione non funziona in questo modo.
Stefan Schmidt,

Funziona con il segreto condiviso memorizzato L2TP, mentre scutilnon lo fa!
Konstantin Suvorov,

Funziona perfettamente, poiché scutilnon accetta nessuno dei dati salvati, il che è una seccatura.
Matt Fletcher,

Ha funzionato per me su OS X 10.13.5 !!
Utente 7391

0

Ho appena usato la sceneggiatura di cui sopra di slhck (che è chiaramente un dio d'oro) per creare questa elegante sceneggiatura di rubini che potrebbe essere utilizzata per ogni sorta di cose

class SwitchIp

def go
  turn_off
  sleep 3
  turn_on
end

def turn_on
  `/usr/bin/env osascript <<-EOF
      tell application "System Events"
        tell current location of network preferences
            set VPN to service "StrongVPN" -- your VPN name here
            if exists VPN then connect VPN
      end tell
    end tell
  EOF` 
end

def turn_off
  `/usr/bin/env osascript <<-EOF
    tell application "System Events"
      tell current location of network preferences
            set VPN to service "StrongVPN" -- your VPN name here
            if exists VPN then disconnect VPN
      end tell
  end tell
 EOF`
end

end

0

È possibile utilizzare networksetup -connectpppoeservice "myvpn"per connettersi a un VPN chiamato myvpn e utilizzare networksetup -disconnectpppoeservice "myvpn"per disconnettersi dal VPN chiamato myvpn

Prima di utilizzare queste righe di comando, è necessario configurare manualmente una connessione in Preferenze di Sistema> Rete


0

Funziona su MacOS 10.14.5 Mojave:

Connetti VPN : usa la risposta di @ slhck -> networksetup -connectpppoeservice "VPN Name"

Disconnect VPN : dalla risposta di @ encoded -> scutil --nc stop "VPN Name"

Questo ha funzionato per il mio L2TP su VPN IPSEC. Non ho testato le VPN Cisco IPSEC o IKEv2

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.