Запустите настроенный VPN из командной строки (OSX)

48

У меня есть две конфигурации VPN на моем Mac, и я хотел бы иметь возможность запускать их с консоли, когда я ssh на мою машину.

Я нашел команду, networksetupкоторая позволяет мне настраивать соединения, но, насколько я могу судить, на самом деле не запускает.

Используя Льва.

Ketema
источник

Ответы:

41

Для более новых версий macOS может использоваться очень простая команда, как показано в ответах ниже, например, эта (дайте ей +1!).

Все что тебе нужно это:

 networksetup -connectpppoeservice "UniVPN"

Единственная проблема заключается в том, что вы не можете отключиться с помощью этой команды.


Вы также можете использовать AppleScript для подключения к VPN-сервисам по вашему выбору. Мы будем использовать функции оболочки, которые доступны из командной строки после их загрузки.

Добавьте нижеприведенные функции к вашему ~/.bash_profileили ~/.profile(что бы вы ни использовали).

Вам просто нужно изменить имя самого VPN-соединения, как это указано в настройках сети . Я использовал свой университетский VPN здесь.

введите описание изображения здесь

Вы также можете изменить названия функций, если хотите сделать это для разных. Можно было бы сократить это, используя аргументы, но это прекрасно работает. Я тестировал его на Snow Leopard (но Leopard и Lion тоже должны работать).

После добавления функций перезагрузите терминал и вызовите их с помощью vpn-connectи 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
источник
Я получил такую ​​работу, вставив галочки, как в коде boulder_ruby. Однако в идеале он будет ждать обратного вызова, прежде чем вернуться. Моя цель - бежать vpn-connect && git fetch && vpn-disconnect. Как вы думаете, есть способ сделать это?
Майкл Форрест
Хорошая идея. Я обновил свой сценарий… только что проверил его, и он, кажется, работает.
Slhck
1
Это может быть очевидно, но просто для справки: кажется, вам действительно нужен открытый сеанс графического интерфейса, чтобы это работало. Когда я вхожу через SSH во время сеанса GUI того же пользователя, активного на этом компьютере, и вызываю vpn-connectего, он выдает, syntax error: Expected end of line but found identifier. (-2741)но после преобразования его в приложение с помощью редактора AppleScript и вызова open vpn-connect.appего работает. Однако, если нет активного сеанса GUI этого пользователя, a LSOpenURLsWithRole() failed with error -10810вызывается при вызове через SSH.
Стефан Шмидт
56

Вы также можете, по крайней мере, со Льва 1 , использовать команду scutil.

Например, если у меня есть VPN-сервис с именем «Foo», я мог бы подключиться через:

$ scutil --nc start Foo

При желании я могу указать пользователя, пароль и секрет, используя флаги с одинаковыми именами:

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

Услугу можно отключить через:

$ scutil --nc stop Foo

Для получения более подробной справки вы можете посмотреть справочную страницу или запустить:

$ scutil --nc help

Обновить

Добавление быстрого скрипта для опроса, пока не будет установлено соединение (в ответ на комментарий Эрика Б.

#!/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

Примечания:

  1. Непонятно, когда эта команда была добавлена ​​в OSX, у меня она есть в Mavericks, и пользователь Eric B. сообщает, что она работает в Lion (10.7.5).
закодированный
источник
Просто попробовал это в Lion (10.7.5), и он прекрасно работает. Просто не задокументировано на страницах руководства. Спасибо!
Эрик Б.
Подождать, пока scutil не дождется завершения соединения, прежде чем вернуться? Мне нужно запустить скрипт, как только соединение установлено, но scutil возвращается слишком быстро, и перед установлением соединения выполняется следующая команда.
Эрик Б.
@EricB. Смотрите мои обновления для быстрого сценария.
закодировано
Опция имени пользователя должна быть --user, а не--username
Rockallite
2
Есть идеи, почему scutil --nc stop Fooне работает (на Yosemite)?
fdot
26

Я не проверял это под Lion, но я использую следующую команду под Mountain Lion без проблем:

networksetup -connectpppoeservice UniVPN
пьер-о
источник
Это должно работать, эта утилита была добавлена ​​еще в 02 году.
El Developer
2
Да, удивительно, что этот подход работает, даже если коммутатор предназначен не для служб VPN, а для служб PPPoE, но отключение не работает таким образом.
Стефан Шмидт
Это работает с общим секретом, хранящимся в L2TP, пока scutilнет!
Константин Суворов
Это работает отлично, так как scutilне берет никаких сохраненных данных, что является болью.
Мэтт Флетчер
Работал у меня на OS X 10.13.5 !!
User7391
0

Я просто использовал приведенный выше скрипт от slhck (который явно золотой бог), чтобы создать этот отличный рубиновый скрипт, который можно было бы использовать для всех видов вещей.

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
источник
0

Вы можете использовать networksetup -connectpppoeservice "myvpn"для подключения к vpn с именем myvpn и использовать networksetup -disconnectpppoeservice "myvpn"для отключения от vpn с именем myvpn

Перед использованием этих командных строк вам необходимо вручную настроить соединение в Системных настройках> Сеть

Фэн лю
источник
0

Работает на MacOS 10.14.5 Mojave:

Подключите VPN : используйте ответ @ slhck -> networksetup -connectpppoeservice "VPN Name"

Отключить VPN : от ответа @ encoded -> scutil --nc stop "VPN Name"

Это работает для моего L2TP через IPSEC VPN. Я не тестировал Cisco IPSEC или IKEv2 VPN

Эрик Нельсон
источник