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


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
}

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).

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

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

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ć


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.