Answers:
对于较新的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
}
vpn-connect && git fetch && vpn-disconnect
。您认为有办法吗?
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 。
从至少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
脚注:
--user
,而不是--username
scutil --nc stop Foo
不起作用(在优胜美地上)?
还没有在Lion下测试过,但是我在Mountain Lion下使用以下命令没有任何问题:
networksetup -connectpppoeservice UniVPN
scutil
不能使用!
scutil
它不会占用任何已保存的数据,这很痛苦。
我只是使用了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
在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