Uruchom skonfigurowaną sieć VPN z wiersza polecenia (OSX)

48

Mam dwie konfiguracje VPN na moim komputerze Mac i chciałbym móc je uruchomić z konsoli, gdy ssh na moim komputerze.

Znalazłem polecenie, networksetupktóre pozwala mi konfigurować połączenia, ale o ile mogę stwierdzić, nie uruchamiam żadnego.

Korzystanie z lwa.

Ketema
źródło

Odpowiedzi:

41

W przypadku nowszych wersji systemu macOS można użyć bardzo prostej komendy, jak pokazano w poniższych odpowiedziach, np. Tej (daj jej +1!).

Wszystko czego potrzebujesz to:

 networksetup -connectpppoeservice "UniVPN"

Jedynym problemem jest to, że nie można rozłączyć za pomocą tego polecenia.


Możesz także użyć AppleScript, aby połączyć się z wybranymi usługami VPN. Użyjemy funkcji powłoki, które są dostępne z wiersza poleceń po ich załadowaniu.

Dodaj poniższe funkcje do swojego ~/.bash_profilelub ~/.profile(cokolwiek używasz).

Musisz tylko zmienić nazwę samego połączenia VPN, tak jak pojawia się w preferencjach sieci . Użyłem tutaj mojej uniwersyteckiej sieci VPN.

wprowadź opis zdjęcia tutaj

Możesz także zmienić nazwy funkcji, jeśli chcesz to zrobić dla różnych. Można to skrócić za pomocą argumentów, ale w ten sposób działa dobrze. Przetestowałem to na Snow Leopard (ale Leopard i Lion też powinny działać).

Po dodaniu funkcji ponownie załaduj terminal i wywołaj je odpowiednio przy pomocy vpn-connecti vpn-disconnect.


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
źródło
Pracowałem nad tym, wprowadzając backticks jak w kodzie boulder_ruby. Jednak idealnie byłoby czekać na oddzwonienie przed powrotem. Moim celem jest bieg vpn-connect && git fetch && vpn-disconnect. Czy uważasz, że jest na to sposób?
Michael Forrest
Dobry pomysł. Zaktualizowałem skrypt… właśnie go przetestowałem i wydaje się, że działa.
slhck
1
Może to być oczywiste, ale dla przypomnienia: wydaje się, że tak naprawdę potrzebujesz otwartej sesji GUI, aby to zadziałało. Kiedy loguję się przez SSH, podczas gdy na tym komputerze jest aktywna sesja GUI tego samego użytkownika i wywołanie vpn-connectgo wywołuje rzut, syntax error: Expected end of line but found identifier. (-2741)ale po przekonwertowaniu go na aplikację za pomocą edytora AppleScript i wywołanie open vpn-connect.appgo działa. Jednak jeśli nie ma aktywnej sesji GUI tego użytkownika, to LSOpenURLsWithRole() failed with error -10810jest wywoływana podczas wywoływania go przez SSH.
Stefan Schmidt,
56

Możesz także, przynajmniej od Lwa 1 , użyć polecenia scutil.

Na przykład, jeśli mam usługę VPN o nazwie „Foo”, mogę połączyć się przez:

$ scutil --nc start Foo

Opcjonalnie mogę określić użytkownika, hasło i klucz tajny, używając flag o tych samych nazwach:

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

Usługę można rozłączyć poprzez:

$ scutil --nc stop Foo

Aby uzyskać bardziej szczegółową pomoc, możesz zobaczyć stronę podręcznika lub uruchomić:

$ scutil --nc help

Aktualizacja

Dodanie szybkiego skryptu do odpytywania do momentu ustanowienia połączenia (w odpowiedzi na komentarz Erica 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

Przypisy:

  1. Nie jest jasne, kiedy to polecenie zostało dodane do OSX, mam je w Mavericks, a użytkownik Eric B. informuje, że działa w Lion (10.7.5).
zakodowane
źródło
Właśnie wypróbowałem to w Lionie (10.7.5) i działa świetnie. Po prostu nie udokumentowane na stronach podręcznika. Dzięki!
Eric B.
Czy ktoś czeka na scutil, aby poczekał na zakończenie połączenia przed powrotem? Muszę uruchomić skrypt po ustanowieniu połączenia, ale scutil wraca zbyt szybko i następujące polecenie jest wykonywane przed nawiązaniem połączenia.
Eric B.
@EricB. Zobacz moje aktualizacje, aby uzyskać szybki skrypt.
zakodowano
--user--username
Opcją
2
Wszelkie pomysły, dlaczego scutil --nc stop Foonie działa (w Yosemite)?
fdot
26

Nie testowałem tego pod Lionem, ale bez problemu używam następującego polecenia pod Mountain Lion:

networksetup -connectpppoeservice UniVPN
pierre-o
źródło
To powinno działać, narzędzie to zostało dodane w '02.
El Developer
2
Tak, zaskakująco to podejście działa, nawet jeśli przełącznik nie dotyczy usług VPN, ale usług PPPoE, ale rozłączanie nie działa w ten sposób.
Stefan Schmidt
Działa to z współdzielonym tajnym L2TP, podczas gdy scutilnie!
Konstantin Suworow
Działa to doskonale, ponieważ scutilnie pobiera żadnych zapisanych danych, co jest uciążliwe.
Matt Fletcher
Pracował dla mnie na OS X 10.13.5 !!
User7391
0

Właśnie użyłem powyższego skryptu autorstwa slhck (który jest wyraźnie złotym bogiem), aby stworzyć ten fajny skrypt ruby, który mógłby być używany do wszelkiego rodzaju rzeczy

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
źródło
0

Możesz użyć, networksetup -connectpppoeservice "myvpn"aby połączyć się z siecią VPN o nazwie myvpn i użyć, networksetup -disconnectpppoeservice "myvpn"aby rozłączyć się z siecią VPN o nazwie myvpn

Przed użyciem tych wierszy poleceń należy ręcznie skonfigurować połączenie w Preferencjach systemowych> Sieć

Feng Liu
źródło
0

Działa na MacOS 10.14.5 Mojave:

Połącz VPN : użyj odpowiedzi @ slhck -> networksetup -connectpppoeservice "VPN Name"

Odłącz VPN : od odpowiedzi @ zakodowanej -> scutil --nc stop "VPN Name"

To działało dla mojego L2TP przez IPSEC VPN. Nie testowałem VPN CPS IPSEC ani IKEv2

Eric Nelson
źródło