前提,linux Python 版本不低于 2.4
机器上已经装了 pptp-vpn ,bind,
有root权限,加一条crontab 几分钟检查一次本脚本,基本能保证vpn无忧
#! /usr/bin/env python2
# encoding=utf-8
import sys,os
sys.path.insert(0,os.path.dirname(sys.path[0]))
reload(sys)
sys.setdefaultencoding('utf8')
import re,time
print "\n\n========================================================%s=============================================================" % time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
if os.geteuid() != 0:
print "This program must be run as root. Aborting."
sys.exit()
os.popen('PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin')
os.popen('export PATH')
#需要走VPN的网站
domain =['www.国外网站1.com','www.国外网站2.com']
#清理VPN残留进程
kill_vpn_pid = "ps aux|grep ppp|grep -v grep|awk '{print $2}' |xargs kill -9"
#按照网段加入路由
route_cmd ="/sbin/route add -net %s.0 netmask 255.255.255.0 ppp0"
route_ip =[]
route_find_cmd = "/sbin/route |awk '{print $1}'| grep '%s'"
def start_vpn(vpn_id=1):
vpn_pre = 'us%s'
vpn = vpn_pre % str(vpn_id)
fuck_vpn = os.popen('/usr/sbin/pptpsetup --delete testvpn').read()
vpn_status = os.popen('/usr/sbin/pptpsetup --create testvpn --server '+vpn+'.51povpn.com --username [email protected] --password 20141231 --encrypt --start').read()
#假设vpn启动成功,必定会出现以下文字
if vpn_status.find('local IP address') != -1 and vpn_status.find('Using interface ppp') != -1 and vpn_status.find('authentication succeeded') !=-1:
return True
else:
return False
vpn_runing = os.popen('/sbin/ifconfig').read().find('ppp0')
#vpn 挂了,重新开VPN
if vpn_runing == -1:
os.popen('/usr/sbin/poff')
print "没有发现VPN进程 , vpn 可能挂了"
if os.popen("ps aux|grep ppp|grep -v grep|awk '{print $2}'").read() != '':
print ",正在清理VPN残留进程"
os.popen(kill_vpn_pid)
print "正在重启VPN "
if not start_vpn(1) :
print "1线启动失败 正在尝试其他线路......"
vpn_start = False
for i in range(2,10):
i = int(i)
print "正在尝试 %d 线 ...." % i ,
if start_vpn(i)==True:
vpn_start = True
print " 登陆成功 " % i
break;
else:
print ""
time.sleep(1)
if vpn_start == False:
print "抱歉,vpn起不来,请检查防火墙"
sys.exit()
else:
print "1线 启动成功 "
else:
print "VPN 正在运行 \n"
i=0
for url in domain:
dig_cmd = '/usr/bin/dig A '+ url
print "正在检查到 %s 的路由 " % url
out = os.popen(dig_cmd).read()
regex = re.compile("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", re.I | re.U | re.S)
result = out.split(";;")
finder = ''
for i in range(len(result)):
if result[i].find("ANSWER SECTION") !=-1:
finder = result[i]
break
ips = regex.findall(finder)
ip_pre = []
for ip in ips:
ip_lst = ip.split('.')
t_ip3 ='.'.join([ip_lst[i] for i in range(3)])
#匹配路由表
if os.popen(route_find_cmd % t_ip3).read() == '':
ip_pre.append(t_ip3)
if len(ip_pre)>0:
route_ip.append(list(set(ip_pre)))
print "\n"
if len(route_ip)>0:
for domain_route in route_ip:
for ip in domain_route:
output = os.popen(route_cmd % ip)
print ("执行路由添加" + route_cmd) % ip
#output.read()
else:
print "路由表正常"
print "\n\n===================================VPN Status=======================================\n"+os.popen("/sbin/ifconfig ppp0").read()