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

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

我的 Mac 上有两个 VPN 配置,我希望当我通过 ssh 进入我的机器时能够从控制台启动它们。

我找到了允许我配置连接的命令networksetup,但据我所知,实际上并没有启动连接。

使用 Lion。

答案1

对于较新的 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
}

答案2

从 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) 中有效。

答案3

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

networksetup -connectpppoeservice UniVPN

答案4

我刚刚使用了 slhck(他显然是黄金大神)的上述脚本来创建这个漂亮的 ruby​​ 脚本,它可以用于各种各样的事情

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

相关内容