编写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

  开始使用云梯吧 :)

时间: 2024-11-03 11:43:55

编写Python脚本批量配置VPN的教程的相关文章

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

  这篇文章主要介绍了编写Python脚本把sqlAlchemy对象转换成dict的教程,主要是基于Python的model类构建一个转换的方法,需要的朋友可以参考下 在用sqlAlchemy写web应用的时候,经常会用json进行通信,跟json最接近的对象就是dict,有时候操作dict也会比操作ORM对象更为方便,毕竟不用管数据库session的状态了. 假设数据库里有一张post表,其中一种方法就是 ? 1 2 p = session.query(Post).first() p.__di

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

  这篇文章主要介绍了编写Python脚本来获取mp3文件tag信息的教程,代码基于Python2.x,文中的注释很详细,需要的朋友可以参考下 下面利用一个python的实例程序,来学习python.这个程序的目的就是分析出所有MP3文件的Tag信息并输出. import os # 导入os模块,提供文件路径,列出文件等方法 import sys # 导入sys模块,使用sys.modules获取模块中的所有内容,类似反射的功能 from UserDict import UserDict # 这

WIN Server 2003配置VPN服务器教程

  WIN Server 2003配置VPN服务器教程, 步骤/方法 点击开始菜单,选择所有程序--管理工具---选择<路由和远程访问>  打开<路由和远程访问>的界面,右击选择<配置并启用路由和远程访问> 弹出服务器的安装向导,选择<下一步> 选择用来做内网卡的本地连接,我这里设置是本地连接2为内网卡 这里可以选择<自动>也可以选择<来自一个指定的地址范围  点击下一步,点击完成 安装完成 测试VPN连接: 右击<我的电脑>选

C#调用Python脚本的简单示例_C#教程

IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Hugunin所发起,是一个开源的项目,基于微软的 DLR引擎.IronPython的在CodePlex上的主页:http://ironpython.codeplex.com/  使用场景: 如果你的小伙伴会写Python脚本,而且已经实现大部分项目的功能不需要再用C# 实现.现在缺少窗体,此时Python+C#的组合就可以完美的结局问题啦! 示例: 借由IronPython,就可以利用.NET执行存储在

使用Python脚本批量裁切栅格

    对栅格的裁切,我们通常使用裁切(数据管理-栅格-栅格处理)或按掩膜提取(空间分析-提取分析)来裁切,裁切的矢量要素通常是一个要素图层或Shape文件.如果要进行批量处理,可以使用ToolBox中的批量处理工具.但是,有时我们选择的裁切矢量要素不是一个要素图层,而是要素图层中的一个要素,如按标准图幅裁切栅格影像,以前的做法是将要素一个一个的导出来,再进行批量处理.快速导出方法:ArcGIS按字段属性分割文件.     现在,可以使用Python脚本来批量裁切,在网上找了位大神的原始代码学习

让IIS7.5 执行Python脚本的配置方法_win服务器

[详细步骤]: 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->处理程序映射->添加脚本映射->请求路径:

CentOS/Ubuntu配置VPN代理服务器教程

CentOS配置VPN代理服务器 我这里使用的是CentOS 6.4,其他发行版本linux的配置基本一致. 1.首先确认VPS的PPP和TUN设备是否安装正确    代码如下 复制代码 ls /dev/ppp ls /dev/net/tun # 或 cat /dev/ppp cat /dev/net/tun 如果提示"No such file or directory"或"No such device or address"则表示未安装,一般来说可以直接向你的VP

如何编写Python脚本替换文件中的多行字符?

 问题描述  解题思路  代码实现  Python的特点  1.问题描述 项目源码很大,属于C/C++混合的那种,编程风格也很多样,有'.c'.'.cc'.'cpp'.'.h'.'.hh'等文件.我要完成的任务是:把包含特定几行内容的注释删掉,如(声明:下面的内容只是我随便举的一个例子,项目源码中不涉及下面的内容.) /*  * Copyright 2002 Sun Microsystems, Inc. All rights reserved. * * Redistribution and us

需求驱动学习之Python(如何编写Python脚本替换文件中的多行字符?)

当一个人太执着于某一个东西的时候, 会错过很多美好的东西! Python值得学习的一个工具,不要局限在当前使用的语言中. 在大概3个月之前,Python对我来说一直是个迷.然而,就在3个月前我经理给我一个任务--删除(替换)所有项目源码文件中包含特定几行内容的 所有注释.整个项目源码的大小有1G,在Linux服务器(中高档)上编译需要半个多小时,可见代码量之大,不可能手动去一个一个改.肯定得用脚本去处 理,于是我想到了Python.在这之前没有接触过Python,花了2个星期一顿恶补之后,总算顺