Inicie la VPN configurada desde la línea de comandos (OSX)

Respuestas:

41

Para versiones más recientes de macOS, se puede usar un comando muy simple, como se muestra en las respuestas a continuación, por ejemplo, esta (¡dale un +1!).

Todo lo que necesitas es:

 networksetup -connectpppoeservice "UniVPN"

El único problema es que no puede desconectarse con este comando.


También puede usar AppleScript para conectarse a los servicios VPN que elija. Utilizaremos funciones de shell, que están disponibles desde la línea de comandos, una vez que se cargan.

Agregue las funciones a continuación a su ~/.bash_profileo ~/.profile(lo que sea que use).

Solo necesita cambiar el nombre de la conexión VPN, tal como aparece en las preferencias de Red . Usé mi VPN de la universidad aquí.

ingrese la descripción de la imagen aquí

También puede cambiar los nombres de las funciones, si desea hacerlo para diferentes. Es posible acortar esto usando argumentos, pero funciona bien de esta manera. Lo probé en Snow Leopard (pero Leopard y Lion también deberían funcionar).

Una vez que haya agregado las funciones, vuelva a cargar la terminal y llámelas con vpn-connecty vpn-disconnect, respectivamente.


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
}
slhck
fuente
Obtuve este tipo de trabajo poniendo backticks como en el código de boulder_ruby. Sin embargo, idealmente esperaría una devolución de llamada antes de regresar. Mi objetivo es correr vpn-connect && git fetch && vpn-disconnect. ¿Crees que hay una manera de hacer esto?
Michael Forrest
Buena idea. Actualicé mi script ... solo lo probé y parece funcionar.
slhck
1
Esto puede ser obvio, pero solo para el registro: parece que realmente necesita una sesión de GUI abierta para que esto funcione. Cuando inicio sesión a través de SSH mientras hay una sesión de GUI del mismo usuario activo en esa máquina y lo llamo vpn-connect, lanza un syntax error: Expected end of line but found identifier. (-2741)pero después de haberlo convertido en una aplicación con el editor AppleScript y llamarlo open vpn-connect.appfunciona. Sin embargo, si no hay una sesión GUI activa de ese usuario, LSOpenURLsWithRole() failed with error -10810se emite un mensaje al llamarlo a través de SSH.
Stefan Schmidt
56

También puede, al menos desde Lion 1 , usar el comando scutil.

Por ejemplo, si tengo un servicio VPN llamado "Foo", podría conectarme a través de:

$ scutil --nc start Foo

Opcionalmente, puedo especificar un usuario, contraseña y secreto usando banderas con los mismos nombres:

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

El servicio se puede desconectar a través de:

$ scutil --nc stop Foo

Para obtener ayuda más detallada, puede ver la página de manual o ejecutar:

$ scutil --nc help

Actualizar

Agregar un script rápido para sondear hasta que se establezca la conexión (en respuesta al comentario de 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

Notas al pie:

  1. No está claro cuándo se agregó este comando a OSX, lo tengo en Mavericks, y el usuario Eric B. informa que funciona en Lion (10.7.5).
codificado
fuente
Acabo de probar esto en Lion (10.7.5) y funciona muy bien. Simplemente no está documentado en las páginas del manual. ¡Gracias!
Eric B.
¿Alguna espera para que scutil espere hasta que se complete la conexión antes de regresar? Necesito ejecutar un script una vez que se establece la conexión, pero scutil regresa demasiado rápido y el siguiente comando se ejecuta antes de que se establezca la conexión.
Eric B.
@EricB. Vea mis actualizaciones para un script rápido.
codificado el
La opción de nombre de usuario debería ser --user, no--username
Rockallite
2
¿Alguna idea de por qué scutil --nc stop Foono funciona (en Yosemite)?
fdot
26

No he probado esto en Lion, pero estoy usando el siguiente comando en Mountain Lion sin ningún problema:

networksetup -connectpppoeservice UniVPN
pierre-o
fuente
Esto debería funcionar, esta utilidad se agregó en '02.
El Developer
2
Sí, sorprendentemente, este enfoque funciona a pesar de que el cambio no es para servicios VPN sino para servicios PPPoE, pero la desconexión no funciona de esta manera.
Stefan Schmidt
Esto funciona con el secreto compartido almacenado de L2TP, ¡pero scutilno lo hace!
Konstantin Suvorov
Esto funciona perfectamente, ya scutilque no toma ninguno de los datos guardados, lo cual es una molestia.
Matt Fletcher
¡Me funcionó en OS X 10.13.5!
Usuario7391
0

Acabo de usar el script anterior de slhck (que es claramente un dios dorado) para crear este ingenioso script ruby ​​que podría usarse para todo tipo de cosas

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
boulder_ruby
fuente
0

Puede usar networksetup -connectpppoeservice "myvpn"para conectarse a un vpn llamado myvpn, y usar networksetup -disconnectpppoeservice "myvpn"para desconectarse del vpn llamado myvpn

Antes de usar estas líneas de comando, debe configurar manualmente una conexión en Preferencias del sistema> Red

Feng Liu
fuente
0

Funciona en MacOS 10.14.5 Mojave:

Conecte VPN : use la respuesta de @ slhck -> networksetup -connectpppoeservice "VPN Name"

Desconectar VPN : de la respuesta de @ encoded -> scutil --nc stop "VPN Name"

Esto funcionó para mi L2TP sobre IPSEC VPN. No probé las VPN IPSEC o IKEv2 de Cisco

Eric Nelson
fuente