一个linux下的Python的vpn拨号,以及自动添加路由程序

前提,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()




猜你喜欢

转载自blog.csdn.net/swg0110/article/details/42350355