编写Python脚本批量配置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

了解配置文件结构

拿一个配置文件出来看看:

[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 按你喜好配置就好

既然了解了,就开工吧
准备配置信息及模板

首先,让我们准备好材料:

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 需要动态生成了

>>> 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 服务器信息,生成模板了

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 就行了。

os.chmod(filename, 0600)

完整的脚本

https://gist.github.com/greatghoul/9066705
享受成果

修改 tpl.cfg 中相关的用户名为自己的,然后执行下面的命令。

$ 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

开始使用云梯吧 :)

(0)

相关推荐

  • python通过zlib实现压缩与解压字符串的方法

    本文实例讲述了python通过zlib实现压缩与解压字符串的方法.分享给大家供大家参考.具体实现方法如下: 使用zlib.compress可以压缩字符串.使用zlib.decompress可以解压字符串.如下 复制代码 代码如下: #coding=utf-8 import zlib s = "hello word, 00000000000000000000000000000000" print len(s) c = zlib.compress(s) print len(c) d = 

  • python中urllib模块用法实例详解

    本文实例讲述了python中urllib模块用法.分享给大家供大家参考.具体分析如下: 一.问题: 近期公司项目的需求是根据客户提供的api,我们定时去获取数据, 之前的方案是用php收集任务存入到redis队列,然后在linux下做一个常驻进程跑某一个php文件, 该php文件就一个无限循环,判断redis队列,有就执行,没有就break. 二.解决方法: 最近刚好学了一下python, python的urllib模块或许比php的curl更快,而且简单. 贴一下代码 复制代码 代码如下: #

  • python统计一个文本中重复行数的方法

    本文实例讲述了python统计一个文本中重复行数的方法.分享给大家供大家参考.具体实现方法如下: 比如有下面一个文件 2 3 1 2 我们期望得到 2,2 3,1 1,1 解决问题的思路: 出现的文本作为key, 出现的数目作为value,然后按照value排除后输出 最好按照value从大到小输出出来,可以参照: 复制代码 代码如下: in recent Python 2.7, we have new OrderedDict type, which remembers the order in

  • 编写Python脚本批量配置VPN的教程

    缘起 大家都知道,最近的网络不怎么和谐,速度慢不说,VPN 还总断,好在云梯 提供了挺多的服务器可以切换, 但云梯的服务器又挺多,Linux 的 Network Manager 又不支持批量添加配置,甚至配置文件都不能复制新建, 每个服务器的配置都得手动加,非常麻烦. 当然,也可以每次切换时打开配置,光改地址,但是这也非常不方便. 作为一个合格的开发人员,当然会想到用程序批量生成配置,我选择使用 Python. 寻找配置文件的位置 要批量创建配置,首先得知道配置文件在哪里,比如自己的云梯 VPN

  • 编写Python脚本批量下载DesktopNexus壁纸的教程

    DesktopNexus 是我最喜爱的一个壁纸下载网站,上面有许多高质量的壁纸,几乎每天必上, 每月也必会坚持分享我这个月来收集的壁纸 但是 DesktopNexus 壁纸的下载很麻烦,而且因为壁纸会通过浏览器检测你当前分辨率来展示 合适你当前分辨率的壁纸,再加上是国外的网站,速度上很不乐观. 于是我写了个脚本,检测输入的页面中壁纸页面的链接,然后批量下载到指定文件夹中. 脚本使用 python 写的,所以需要机器上安装有 python . 用法: $ python desktop_nexus.

  • centos 自动运行python脚本和配置 Python 定时任务

    目录 一.centos实现自动运行Python脚本 二.centos中测试定时任务 1.crontab文件 2.详细配置 3.设置定时任务 一.centos 实现自动运行 Python 脚本 正式配置前,先编写一段 Python 脚本,实现日志写入文件操作: import os import sys import logging current_path = os.getcwd() # 获取当前目录 logging.basicConfig(level=logging.INFO,        

  • PyCharm导入python项目并配置虚拟环境的教程详解

    进入PyCharm后,点击File→Open,然后在弹窗中选择需要导入项目的文件夹: 打开了python项目后,需要配置该项目对应的python才可以正常运行: 配置步骤:File→settings 在设置弹窗中选择Project Interpreter,然后点击add: 在弹窗中,选择Existing environment,路径可以选择python项目的路径: 然后就大功告成了,可以去试着运行你的程序了~ 总结 以上所述是小编给大家介绍的PyCharm导入python项目并配置虚拟环境的教程

  • 利用Python脚本批量生成SQL语句

    通过Python脚本批量生成插入数据的SQL语句 原始SQL语句: INSERT INTO system_user (id, login_name, name, password, salt, code, createtime, email, main_org, positions, status, used, url, invalid, millis, id_card, phone_no, past, end_date, start_date) VALUES ('6', 'db', 'db',

  • python virtualenv虚拟环境配置与使用教程详解

    概述 python开发过程中,我们可能需要同时开发多款应用,这些应用可能公用同一个版本的Python程序,但是使用不同版本的第三方库,比如A应用使用six 1.12.0,而B应用需要使用six 1.15.0.这种情况下,virtualenv就派上用场了,它能为每个应用提供一套"相对独立"的Python虚拟运行环境. 注意,这里为啥是"相对独立"而不是"绝对独立"呢?针对一些.exe依赖程序,默认安装时,不会安装在虚拟环境中,安装后为各个应用共享,

  • 编写Python脚本来获取mp3文件tag信息的教程

    下面利用一个python的实例程序,来学习python.这个程序的目的就是分析出所有MP3文件的Tag信息并输出. import os # 导入os模块,提供文件路径,列出文件等方法 import sys # 导入sys模块,使用sys.modules获取模块中的所有内容,类似反射的功能 from UserDict import UserDict # 这个表示从UserDict类中导入UserDict,类似于Java中的 import UserDict.UserDict def stripnul

  • 编写Python脚本把sqlAlchemy对象转换成dict的教程

    在用sqlAlchemy写web应用的时候,经常会用json进行通信,跟json最接近的对象就是dict,有时候操作dict也会比操作ORM对象更为方便,毕竟不用管数据库session的状态了. 假设数据库里有一张post表,其中一种方法就是 p = session.query(Post).first() p.__dict__ 但由于p是sqlAlchemy的对象,所以p.__dict__中会有一些其他的属性比如_sa_instance这种我们不需要关注的 那么我们可以给model的基类加一个方

  • 编写Python脚本来实现最简单的FTP下载的教程

    访问FTP,无非两件事情:upload和download,最近在项目中需要从ftp下载大量文件,然后我就试着去实验自己的ftp操作类,如下(PS:此段有问题,别复制使用,可以参考去试验自己的ftp类!) import os from ftplib import FTP class FTPSync(): def __init__(self, host, usr, psw, log_file): self.host = host self.usr = usr self.psw = psw self.

  • 让IIS7.5 执行Python脚本的配置方法

    [详细步骤]: 1. 从Python下载windows版本的安装程序(点击进入),我这里由于操作系统是x64的因此选择Python 2.7.11 x64 Installer ~ 2. 安装,这里建议不要安装到系统盘,以免重做系统后再次安装~ 3. IIS7.5->ISAPI和CGI限制->右键添加->ISAPI或CGI路径选择Python文件夹下的python.exe %s %s:描述中填写:python. 4.IIS7.5->处理程序映射->添加脚本映射->请求路径:

随机推荐