Starten Sie das konfigurierte VPN von der Kommandozeile (OSX)

48

Ich habe zwei VPN-Konfigurationen auf meinem Mac und möchte sie von der Konsole aus starten können, wenn ich auf meinem Computer ssh bin.

Ich habe den Befehl gefunden, networksetupder es mir erlaubt, Verbindungen zu konfigurieren, aber soweit ich das beurteilen kann, startet man eigentlich nicht.

Lion verwenden.

Ketema
quelle

Antworten:

41

Für neuere MacOS-Versionen kann ein sehr einfacher Befehl verwendet werden, wie in den folgenden Antworten gezeigt, z. B. dieser (geben Sie +1!).

Alles was Sie brauchen ist:

 networksetup -connectpppoeservice "UniVPN"

Das einzige Problem ist, dass Sie die Verbindung mit diesem Befehl nicht trennen können.


Sie können auch AppleScript verwenden, um eine Verbindung zu den VPN-Diensten Ihrer Wahl herzustellen. Wir werden Shell-Funktionen verwenden, die über die Befehlszeile verfügbar sind, sobald sie geladen sind.

Fügen Sie die folgenden Funktionen zu Ihrem ~/.bash_profileoder hinzu ~/.profile(was auch immer Sie verwenden).

Sie müssen lediglich den Namen der VPN-Verbindung selbst ändern, wie er in den Netzwerkeinstellungen angezeigt wird . Ich habe hier mein Uni-VPN benutzt.

Bildbeschreibung hier eingeben

Sie können auch die Namen der Funktionen ändern, wenn Sie dies für verschiedene Funktionen tun möchten. Es ist möglich, dies mit Argumenten zu verkürzen, aber auf diese Weise funktioniert es einwandfrei. Ich habe es auf Snow Leopard getestet (aber Leopard und Lion sollten auch funktionieren).

Sobald Sie die Funktionen hinzugefügt haben, laden Sie das Terminal und rufen sie mit vpn-connectund vpn-disconnectbezeichnet.


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
quelle
Ich habe diese Art der Arbeit durch das Einfügen von Backticks wie in boulder_rubys Code. Idealerweise würde es jedoch auf einen Rückruf warten, bevor es zurückkehrt. Mein Ziel ist es zu rennen vpn-connect && git fetch && vpn-disconnect. Glauben Sie, dass es einen Weg gibt, dies zu tun?
Michael Forrest
Gute Idee. Ich habe mein Skript aktualisiert ... habe es gerade getestet und es scheint zu funktionieren.
Slhck
1
Dies mag offensichtlich sein, aber nur zur Veranschaulichung: Es scheint, dass Sie tatsächlich eine GUI-Sitzung öffnen müssen, damit dies funktioniert. Wenn ich mich über SSH anmelde, während auf diesem Computer eine GUI-Sitzung desselben Benutzers aktiv ist und vpn-connectes syntax error: Expected end of line but found identifier. (-2741)aufruft, wird ein ausgelöst, aber nachdem ich es mit dem AppleScript-Editor in eine Anwendung konvertiert habe und es aufrufe open vpn-connect.app, funktioniert es. Wenn jedoch keine aktive GUI-Sitzung dieses Benutzers vorhanden LSOpenURLsWithRole() failed with error -10810ist, wird beim Aufrufen über SSH ein ausgelöst.
Stefan Schmidt
56

Ab Lion 1 können Sie auch den Befehl scutil verwenden.

Wenn ich zum Beispiel einen VPN-Dienst namens "Foo" habe, könnte ich eine Verbindung herstellen über:

$ scutil --nc start Foo

Ich kann optional einen Benutzer, ein Kennwort und ein Geheimnis mithilfe von Flags mit demselben Namen angeben:

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

Der Dienst kann getrennt werden über:

$ scutil --nc stop Foo

Weitere Informationen finden Sie auf der Manpage oder unter:

$ scutil --nc help

Aktualisieren

Hinzufügen eines schnellen Skripts zum Abfragen, bis die Verbindung hergestellt ist (als Antwort auf den Kommentar von 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

Fußnoten:

  1. Es ist nicht klar, wann dieser Befehl zu OSX hinzugefügt wurde, ich habe ihn in Mavericks und Benutzer Eric B. berichtet, dass er in Lion (10.7.5) funktioniert.
codiert
quelle
Habe es gerade in Lion (10.7.5) versucht und es funktioniert großartig. Nur nicht in den Manpages dokumentiert. Vielen Dank!
Eric B.
Warten Sie, bis scutil gewartet hat, bis die Verbindung hergestellt ist, bevor Sie zurückkehren? Ich muss ein Skript ausführen, sobald die Verbindung hergestellt ist, aber scutil kehrt zu schnell zurück und der folgende Befehl wird ausgeführt, bevor die Verbindung hergestellt ist.
Eric B.
@EricB. In meinen Updates finden Sie ein schnelles Skript.
codiert
Die Option für den Benutzernamen sollte --usernicht--username
Rockallite
2
Irgendwelche Ideen, warum scutil --nc stop Foonicht funktioniert (auf Yosemite)?
Fdot
26

Habe das noch nicht unter Lion getestet, aber ich verwende folgenden Befehl unter Mountain Lion ohne Probleme:

networksetup -connectpppoeservice UniVPN
Pierre-O
quelle
Dies sollte funktionieren. Dieses Dienstprogramm wurde bereits in '02 hinzugefügt.
El Developer
2
Ja, überraschenderweise funktioniert dieser Ansatz, obwohl der Switch nicht für VPN-Dienste, sondern für PPPoE-Dienste vorgesehen ist. Das Trennen der Verbindung funktioniert jedoch nicht auf diese Weise.
Stefan Schmidt
Dies funktioniert mit L2TP gespeicherten Shared Secret, während scutilnicht!
Konstantin Suvorov
Dies funktioniert einwandfrei, da die scutilgespeicherten Daten nicht übernommen werden, was schmerzhaft ist.
Matt Fletcher
Arbeitete für mich unter OS X 10.13.5 !!
User7391
0

Ich habe gerade das obige Skript von slhck (der eindeutig ein goldener Gott ist) verwendet, um dieses raffinierte Rubinskript zu erstellen, das für alle möglichen Dinge verwendet werden kann

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
quelle
0

Mit können Sie networksetup -connectpppoeservice "myvpn"eine Verbindung zu einem VPN mit dem Namen myvpn herstellen und die Verbindung networksetup -disconnectpppoeservice "myvpn"zu dem VPN mit dem Namen myvpn trennen

Bevor Sie diese Befehlszeilen verwenden können, müssen Sie eine Verbindung in den Systemeinstellungen> Netzwerk manuell konfigurieren

Feng Liu
quelle
0

Funktioniert unter MacOS 10.14.5 Mojave:

VPN verbinden : Verwenden Sie die Antwort von @ slhck -> networksetup -connectpppoeservice "VPN Name"

VPN trennen : Aus der Antwort von @ encoded -> scutil --nc stop "VPN Name"

Dies funktionierte für mein L2TP über IPSEC VPN. Ich habe Cisco IPSEC- oder IKEv2-VPNs nicht getestet

Eric Nelson
quelle