Запустити налаштований VPN з командного рядка (OSX)


48

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

Я знайшов команду, networksetupяка дозволяє мені налаштувати з'єднання, але, наскільки я можу сказати, насправді не запускати.

Використання Лева.


Відповіді:


41

Для новіших версій macOS можна використовувати дуже просту команду, як показано у відповідях нижче, наприклад, ця (надайте +1!).

Все, що тобі потрібно, це:

 networksetup -connectpppoeservice "UniVPN"

Єдина проблема полягає в тому, що ви не можете від'єднатися за допомогою цієї команди.


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

Додайте нижче функції до свого ~/.bash_profileабо ~/.profile(що б ви не використовували).

Вам просто потрібно змінити назву VPN-з'єднання, як це відображається в налаштуваннях мережі . Тут я використовував свій університетський VPN.

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

Ви також можете змінити назви функцій, якщо ви хочете зробити це для різних. Можна скоротити це за допомогою аргументів, але це працює просто чудово. Я тестував його на Snow Leopard (але Леопард і Лев теж повинні працювати).

Після додавання функцій перезавантажте термінал і подзвоніть їм відповідно 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
}

Я працював над цим способом, вводячи задні позиції, як у код boulder_ruby. Однак в ідеалі він буде чекати зворотного дзвінка перед поверненням. Моя мета - бігти vpn-connect && git fetch && vpn-disconnect. Як ви думаєте, є спосіб це зробити?
Майкл Форест

Гарна ідея. Я оновив свій сценарій ... просто перевірив його, і він, здається, працює.
slhck

1
Це може бути очевидним, але лише для запису: Схоже, вам справді потрібен відкритий сеанс GUI, щоб це працювало. Коли я входжу через SSH, коли на цій машині активний сеанс графічного інтерфейсу того самого користувача, і виклик vpn-connectце робить кидком, syntax error: Expected end of line but found identifier. (-2741)але після перетворення його на додаток за допомогою редактора AppleScript та виклику open vpn-connect.appйого працює. Однак якщо немає активного сеансу GUI цього користувача, під 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, і користувач Ерік Б. повідомляє, що вона працює в Lion (10.7.5).

Щойно спробував це у Леві (10.7.5), і це чудово працює. Просто не задокументовано на сторінках man. Дякую!
Ерік Б.

Будь-яке зачекання, щоб отримати скутт, щоб зачекати, поки з'єднання завершиться перед поверненням? Мені потрібно запустити скрипт, коли з'єднання встановлено, але scutil повертається занадто швидко і наступна команда виконується до встановлення з'єднання.
Ерік Б.

@EricB. Дивіться мої оновлення для швидкого сценарію.
закодовано

Опція імені користувача має бути --user, не--username
Rockallite

2
Будь-які ідеї, чому scutil --nc stop Fooне працює (на Yosemite)?
fdot

26

Я ще не перевіряв це під Левом, але я використовую наступну команду під Гірським Левом без проблем:

networksetup -connectpppoeservice UniVPN

Це повинно працювати, ця утиліта була додана ще у 02 році.
El Developer

2
Так, на диво такий підхід працює, навіть якщо комутатор не для VPN-служб, а для служб PPPoE, але відключення не працює таким чином.
Стефан Шмідт

Це працює з L2TP, що зберігається спільним секретом, поки scutilце не відбувається!
Костянтин Суворов

Це прекрасно працює, оскільки scutilне бере жодного із збережених даних, що є болем.
Метт Флетчер

Працював для мене на ОС X 10.13.5 !!
Користувач7391

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

0

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

Перш ніж використовувати ці командні рядки, потрібно вручну налаштувати з'єднання в системних налаштуваннях> Мережа


0

Працює на MacOS 10.14.5 Mojave:

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

Відключіть VPN : з @ кодованої відповіді -> scutil --nc stop "VPN Name"

Це працювало для мого L2TP через IPSEC VPN. Я не перевіряв VPN Cisco IPSEC або IKEv2

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.