配置了VPN之后,觉得好像最后一步人工操作是不是也能自动执行,将自动化进行到底?似乎觉得可行,于是手动对脚本做了修改,并结合Mac脚本语言+Alfred做了一些额外处理,让操作更加便捷高效。 至于文章取名觉得加个“续”可能更好(已经给原文的作者popo留言,如果不留言,原作者看到这个标题以为发生什么灵异事件)。
效果如下:
将TunnelBlick配置中认证部分调整为从文件中读取(如使用auth.txt,将auth-user-pass调整为auth-user-pass auth.txt),每次自动将获取的用户名密码写入到该文件,然后写一个applescripts与TunnelBrick的交互,最后使用alfred的workflow调用一下即可。因此,对原本的python脚本仅做了微调整。
;expire time:2017-07-21
client
dev tun
proto udp
remote {HOST} {PORT}
remote-random-hostname
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
verb 3
auth-nocache
auth-user-pass auth.txt ;这里做相应调整
reneg-sec 0
TunnelBrick 3.7.0
python 2.7
Alfred 2.8.4
简单略微说明一下,看官方Release Notes是说3.6beta24及以上版本就能支持从文件中读取用户名和密码,从3.6beta20起似乎安全有更高要求,所以配置略微麻烦,用户直接修改配置文件后,在链接VPN时,它自己又会从用户配置的文件中同步一份其他地方(同步操作需要管理员权限)。举个例子,我在Tunnelblick中新增配置了义桥机房的vpn,配置命名为yiqiao,可以在目录A下/Users/{user}/Library/Application Support/Tunnelblick/Configurations/yiqiao.tblk/
(这里{user}表示当前下mac的登录用户名),Tunnelblick会将这个配置同步到目录B/Library/Application Support/Tunnelblick/Users/{user}/classa.tblk
下,直接修改该目录下的配置是无效的,因为TunnelBlick一旦使用到这个配置重新覆盖。因此,一种简单的处理方式就是将目录A的文件修改后再将目录B文件修改即可,然后考虑到这个文件又是需要管理员权限,所以需要将具体的脚本加入/etc/sudoer中,这样就不必手动输入管理员密码了。
1.以下程序是从cloud.netease.com上获取用户名和密码,并且将它写到用户配置目录下的auth.txt
python /Users/{user}/work/scripts/classa.py > "/Users/{user}/Library/Application Support/Tunnelblick/Configurations/classa.tblk/Contents/Resources/auth.txt"
2.将生成的用户名和密码同步到TunnelBrick程序实际读取配置的目录。
cp "/Users/{user}/Library/Application Support/Tunnelblick/Configurations/classa.tblk/Contents/Resources/auth.txt" "/Library/Application Support/Tunnelblick/Users/{user}/classa.tblk/Contents/Resources/auth.txt"
注:记得替换{user}为你的登录用户。
3.将以上的脚本一起放到一个如命名为AutoWriteclassa.sh的脚本即可,然后加入到/etc/sudoers
chq ALL=(root) NOPASSWD: /Users/chq/work/scripts/AutoWriteclassb.sh
chq ALL=(root) NOPASSWD: /Users/chq/work/scripts/AutoWriteclassa.sh
chq ALL=(root) NOPASSWD: /Users/chq/work/scripts/AutoWriteyiqiao.sh
4.接下来需要使用applescript下的程序脚本,作用是唤起TunnelBrick,让他自动链接VPN
set vpns to "classa classb yiqiao"
if ("{query}" is in vpns) then
do shell script "sudo /Users/chq/work/scripts/AutoWrite{query}.sh"
end if
tell application "Tunnelblick"
connect "{query}"
get state of first configuration where name = "{query}"
repeat until result = "CONNECTED"
delay 1
get state of first configuration where name = "{query}"
end repeat
end tell
注:{query}表示vpn or classa or classb or yiqiao or office (第5部分会有这些输入参数)
5.使用Alfred workflow展示vpn列表及调用applescript
创建一个workflow,触发vpn展示列表部分如下(选择使用python)
print '<items>\
<item arg="vpn"><subtitle></subtitle><icon>icon.png</icon><title>连接IDC-VPN</title></item>\
<item arg="classa"><subtitle></subtitle><icon>icon.png</icon><title>连接VPN-CLASSA</title></item>\
<item arg="classb"><subtitle></subtitle><icon>icon.png</icon><title>连接VPN-CLASSB</title></item>\
<item arg="yiqiao"><subtitle></subtitle><icon>icon.png</icon><title>连接义桥VPN</title></item>\
<item arg="office"><subtitle></subtitle><icon>icon.png</icon><title>办公区-VPN</title></item>\
</items>'
注:arg是作为mac脚本中{query}的输入。
至此,已经完成所有配置,后边也就不再为公司vpn工作中可能会出现的断开重连操心了。
附件: vpn.zip
本文来自网易实践者社区,经作者陈鸿钦授权发布。