我的 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
脚注:
- 目前尚不清楚此命令何时添加到 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