緣起
大家都知道,最近的網(wǎng)絡(luò)不怎么和諧,速度慢不說,VPN 還總斷,好在云梯 提供了挺多的服務(wù)器可以切換, 但云梯的服務(wù)器又挺多,Linux 的 Network Manager 又不支持批量添加配置,甚至配置文件都不能復(fù)制新建, 每個服務(wù)器的配置都得手動加,非常麻煩。
當(dāng)然,也可以每次切換時打開配置,光改地址,但是這也非常不方便。
作為一個合格的開發(fā)人員,當(dāng)然會想到用程序批量生成配置,我選擇使用 Python。
尋找配置文件的位置
要批量創(chuàng)建配置,首先得知道配置文件在哪里,比如自己的云梯 VPN 地址中包含 example 字樣,這樣找起來就方便了。
grep 'example'? /etc/ -r
于是輕松的定位到了配置文件的位置
grep: /etc/NetworkManager/system-connections/yunti.pptp.b: Permission denied
grep: /etc/NetworkManager/system-connections/yunti.pptp.c: Permission denied
了解配置文件結(jié)構(gòu)
拿一個配置文件出來看看:
[connection] id=yunti.pptp.tw1 uuid=063db9b5-5915-4f3e-8bb4-2fe58abf5be5 type=vpn permissions=user:greatghoul:; autoconnect=false [vpn] service-type=org.freedesktop.NetworkManager.pptp gateway=tw1.example.com require-mppe=yes user=greatghoul refuse-chap=yes refuse-eap=yes password-flags=1 refuse-pap=yes [ipv4] method=auto dns=8.8.8.8;8.8.4.4; ignore-auto-dns=true
顯然,有這么幾個部分需要動態(tài)生成的
- ??? connection.id 這個需要是唯一的
- ??? connection.uuid 就是 uuid 生成一個就好了
- ??? connection.permissions 要添加上你的用戶名嘛
- ??? vpn.gateway VPN 服務(wù)器的地址
- ??? vpn.user VPN 服務(wù)的帳戶名
- ??? ipv4.dns 按你喜好配置就好
既然了解了,就開工吧
準(zhǔn)備配置信息及模板
首先,讓我們準(zhǔn)備好材料:
VPN_SERVERS = [ { 'id': 'yunti.pptp.a', 'gateway': 'a.example.com' }, { 'id': 'yunti.pptp.b', 'gateway': 'b.example.com' }, { 'id': 'yunti.pptp.c', 'gateway': 'c.example.com' }, ]
配置中 uuid 需要動態(tài)生成了
>>> import uuid >>> str(uuid.uuid1()) '0621ba62-888a-11e3-805c-44334c786649'
至于 connection.permissions、vpn.user 和 ipv4.dns 直接寫在配置模板中即可。
tpl.cfg [connection] id=%(id)s uuid=%(uuid)s type=vpn permissions=user:greatghoul:; autoconnect=false [vpn] service-type=org.freedesktop.NetworkManager.pptp gateway=%(gateway)s require-mppe=yes user=greatghoul refuse-chap=yes refuse-eap=yes password-flags=1 refuse-pap=yes [ipv4] method=auto dns=8.8.8.8;8.8.4.4; ignore-auto-dns=true
生成 VPN 連接配置文件
剩下的事,就只有遍歷 VPN 服務(wù)器信息,生成模板了
def add_connection(tpl, conn_info): filename = os.path.join(CFG_DIR, conn_info['id']) print ' Creating file:', filename out = open(filename, 'w') out.write(tpl % conn_info) out.close() os.chmod(filename, 0600) def create_all(): tpl = open(os.path.join(CURRENT_DIR, 'tpl.cfg'), 'r').read() print 'Creating yunti connection files under', CFG_DIR for conn_info in VPN_SERVERS: conn_info.update(uuid=str(uuid.uuid1())) add_connection(tpl, conn_info)
我測試過,雖然 VPN 配置文件的文件名怎么寫都行,但是如果在 NetworkManager 中修改了該連接的信息,NetworkManager 會自動將該配置文件重命為 Connection Name (也就是配置文件中 id),所以在創(chuàng)建文件時,還是保持文件名與 id 一致才好。
還有一個注意點(diǎn)是,連接配置文件必須屬于 root:root 并且權(quán)限設(shè)置為 600, 因?yàn)槲覀冃枰ㄟ^ sudo 執(zhí)行腳本,所以這里只需要控制 chmod 就行了。
os.chmod(filename, 0600)
完整的腳本
https://gist.github.com/greatghoul/9066705
享受成果
修改 tpl.cfg 中相關(guān)的用戶名為自己的,然后執(zhí)行下面的命令。
$ sudo python create_yunti_config.py Cleaning up yunti connection files... Removing file: /etc/NetworkManager/system-connections/yunti.pptp.a Removing file: /etc/NetworkManager/system-connections/yunti.pptp.b Removing file: /etc/NetworkManager/system-connections/yunti.pptp.c Creating yunti connection files under /etc/NetworkManager/system-connections Creating file: /etc/NetworkManager/system-connections/yunti.pptp.a Creating file: /etc/NetworkManager/system-connections/yunti.pptp.b Creating file: /etc/NetworkManager/system-connections/yunti.pptp.c
開始使用云梯吧 :)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
