程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 編寫Python腳本批量配置VPN的教程

編寫Python腳本批量配置VPN的教程

編輯:更多關於編程

       這篇文章主要介紹了編寫Python腳本批量配置VPN的教程,搭建VPN在國內目前是一個非常熱門的行為(嗯...),需要的朋友可以參考下

      緣起

      大家都知道,最近的網絡不怎麼和諧,速度慢不說,VPN 還總斷,好在雲梯 提供了挺多的服務器可以切換, 但雲梯的服務器又挺多,Linux 的 Network Manager 又不支持批量添加配置,甚至配置文件都不能復制新建, 每個服務器的配置都得手動加,非常麻煩。

      當然,也可以每次切換時打開配置,光改地址,但是這也非常不方便。

      作為一個合格的開發人員,當然會想到用程序批量生成配置,我選擇使用 Python。

      尋找配置文件的位置

      要批量創建配置,首先得知道配置文件在哪裡,比如自己的雲梯 VPN 地址中包含 example 字樣,這樣找起來就方便了。

      復制代碼 代碼如下:

      grep 'example' ~/.config -r

      grep 'example' /etc/ -r

      於是輕松的定位到了配置文件的位置

      復制代碼 代碼如下:

      grep: /etc/NetworkManager/system-connections/yunti.pptp.a: Permission denied

      grep: /etc/NetworkManager/system-connections/yunti.pptp.b: Permission denied

      grep: /etc/NetworkManager/system-connections/yunti.pptp.c: Permission denied

      了解配置文件結構

      拿一個配置文件出來看看:

      ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [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

      顯然,有這麼幾個部分需要動態生成的

      connection.id 這個需要是唯一的

      connection.uuid 就是 uuid 生成一個就好了

      connection.permissions 要添加上你的用戶名嘛

      vpn.gateway VPN 服務器的地址

      vpn.user VPN 服務的帳戶名

      ipv4.dns 按你喜好配置就好

      既然了解了,就開工吧

      准備配置信息及模板

      首先,讓我們准備好材料:

      ?

    1 2 3 4 5 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 需要動態生成了

      ?

    1 2 3 >>> import uuid >>> str(uuid.uuid1()) '0621ba62-888a-11e3-805c-44334c786649'

      至於 connection.permissions、vpn.user 和 ipv4.dns 直接寫在配置模板中即可。

      ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 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 服務器信息,生成模板了

      ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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),所以在創建文件時,還是保持文件名與 id 一致才好。

      還有一個注意點是,連接配置文件必須屬於 root:root 並且權限設置為 600, 因為我們需要通過 sudo 執行腳本,所以這裡只需要控制 chmod 就行了。

      ?

    1 os.chmod(filename, 0600)

      完整的腳本

      https://gist.github.com/greatghoul/9066705

      享受成果

      修改 tpl.cfg 中相關的用戶名為自己的,然後執行下面的命令。

      ?

    1 2 3 4 5 6 7 8 9 $ 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

      開始使用雲梯吧 :)

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved