从命令行(OSX)启动配置的VPN


Answers:


41

对于较新的macOS版本,可以使用一个非常简单的命令,如以下答案所示,例如,此命令(给它+1!)。

所有你需要的是:

 networksetup -connectpppoeservice "UniVPN"

唯一的问题是您无法使用此命令断开连接。


您还可以使用AppleScript连接到您选择的VPN服务。加载后,我们将使用命令行中提供的shell函数。

将以下功能添加到您的~/.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
}

我通过像boulder_ruby的代码一样放入反引号来完成这种工作。但是理想情况下,它将在返回之前等待回调。我的目标是跑步vpn-connect && git fetch && vpn-disconnect。您认为有办法吗?
Michael Forrest

好主意。我更新了我的脚本……只是对其进行了测试,它似乎可以正常工作。
slhck

1
这可能很明显,但仅用于记录:看来您实际上需要打开GUI会话才能起作用。当我通过SSH登录时,在该计算机上有同一个用户处于活动状态的GUI会话并调用vpn-connect它时,它确实抛出了一个错误,syntax error: Expected end of line but found identifier. (-2741)但是在使用AppleScript编辑器将其转换为应用程序并调用open vpn-connect.app它后,它可以工作。但是,如果没有该用户的活动GUI会话,LSOpenURLsWithRole() failed with error -10810则在通过SSH调用它时会引发a 。
Stefan Schmidt

56

从至少Lion 1开始,您还可以使用scutil命令。

例如,如果我有一个名为“ Foo”的VPN服务,则可以通过以下方式进行连接:

$ scutil --nc start Foo

我可以选择使用具有相同名称的标志来指定用户,密码和机密:

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

可以通过以下方式断开服务:

$ scutil --nc stop Foo

要获得更详细的帮助,请参见手册页或运行:

$ scutil --nc help

更新资料

添加一个快速脚本以进行轮询,直到建立连接为止(以响应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

脚注:

  1. 目前尚不清楚此命令何时添加到OSX,我在Mavericks中有此命令,用户Eric B.报告说它在Lion(10.7.5)中有效。

刚刚在Lion(10.7.5)中尝试过,效果很好。只是没有记录在手册页中。谢谢!
Eric B.

是否需要等待scutil等到连接完成后才能返回?建立连接后,我需要运行脚本,但是scutil返回的速度过快,并且在建立连接之前执行了以下命令。
Eric B.

@EricB。查看我的更新以获取快速脚本。
2014年

用户名选项应该为--user,而不是--username
Rockallite'1

2
有什么想法为什么scutil --nc stop Foo不起作用(在优胜美地上)?
fdot 2015年

26

还没有在Lion下测试过,但是我在Mountain Lion下使用以下命令没有任何问题:

networksetup -connectpppoeservice UniVPN

此工具应该可以正常工作,该实用程序是在'02中添加的。
El Developer

2
是的,令人惊讶的是,即使该交换机不是用于VPN服务而是用于PPPoE服务,该方法仍然有效,但是断开连接却无法以这种方式工作。
Stefan Schmidt

这适用于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

0

您可以用于networksetup -connectpppoeservice "myvpn"连接到名为myvpn的vpn,并用于networksetup -disconnectpppoeservice "myvpn"与名为myvpn的vpn断开连接

使用这些命令行之前,您需要在系统偏好设置>网络中手动配置连接


0

在MacOS 10.14.5 Mojave上可以使用:

连接VPN:使用@slhck的答案 -> networksetup -connectpppoeservice "VPN Name"

断开VPN:从@encoded的答案 -> scutil --nc stop "VPN Name"

这适用于我的基于IPSEC VPN的L2TP。我没有测试Cisco IPSEC或IKEv2 VPN

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.