【Mac党的福利】一秒钟获取VPN密码(续)

达芬奇密码2018-08-02 10:22

配置了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}的输入。

  • 增加一个Outputs 的Run Script类型,选择OSA-SCRIPT,输入第4部分脚本完毕。

至此,已经完成所有配置,后边也就不再为公司vpn工作中可能会出现的断开重连操心了。

附件: vpn.zip


参考:

https://apple.stackexchange.com/questions/198163/how-to-start-tunnelblick-vpn-connection-via-terminal

本文来自网易实践者社区,经作者陈鸿钦授权发布。