您现在的位置: Tracy‘Blog > 博客 > Python > 正文
Pydial.py的形成
 

       初学Python,在之前想用SHELL写出一个Linux下的拨号工具,当时的思路是:用Shell调用js生成好动态用户名,然后写/etc/ppp/pap-sercretspppoe.conf

       可结果失败了,然后,在学校的BBS上又发现了一个别人写好的包,于是,下载下来,看了看原理,发现和我的思路还是挺相似的。能上网了,出就没再去折腾了。

       可, 最近常常需要换账号上网,我们的okok就不怎么好使了。每次都得ok-config然后再输入用户名密码~~~如此循环~~~

       软件,不就是用来解决这种重复动作的么?

       最近看了些Python,于是,就当练习吧。学学字符处理。

       我在一个文件里保存了一些账号密码,大体格式如下:

rcvd [PAP AuthReq id=0x1 user="\r\n59R,K 37账号" password="密码"]

       目的是:自动用保存账号文件保存的账号密码循环拨号,直到连上网。

       那么,第一步就是对文件处理,得到需要的字符串。

       其实用shell处理或许会更容易些吧,因为我在其中也在多处用到了python调用shell的。

       本想直接用python生成动态用户名写入文件进行拨号的,可后来发现没能成功,原因不详。因为我甚至用Bless打开生成的文件进行对比,发现格式无误。~~~最终,还是选择改下以前的ok.sh,用pythonok.sh所需的信息写好,再调用ok,sh

#####################################################################
#Handle the account first
#####################################################################
	os.system('cat /var/log/pppoe.log | grep password | grep -v pppd > credit.log')
	with open('credit.log') as tem:
		temp = tem.read()
	e_line=temp.splitlines()
	credit=[]
#Frist handle
#username save to [][1],and the password save to [][2]
	for e_item in e_line:
		credit.append(re.split('user=|password=',e_item))
#Get the username and password
#username save to [][0],and the password save to [][1]
	for i in range (0,len(credit)):
		credit[i][1]=credit[i][1][13:len(credit[i][1])-2]
		credit[i][2]=credit[i][2][1:len(credit[i][2])-2]
		del(credit[i][0])
	fin_cre=[]
#Remove the mul user
#	print list(set(credit))
	for i in range (0,len(credit)):
#		print credit.count(credit[i])
		if (credit.count(credit[i])) == 1:
			 fin_cre.append(credit[i])
#Secend handle
	for i in range (0,len(fin_cre)):
		for case in switch(len(fin_cre[i][0])):
			if case(0):
				del(fin_cre[i][0])
				del(fin_cre[i][0])
				break
			if case(5):
				del(fin_cre[i][0])
				del(fin_cre[i][0])
				break
			if case(12):
				fin_cre[i][0]=fin_cre[i][0][1:]
				break
			if case(18):
				fin_cre[i][0]=fin_cre[i][0][1:]
				break
			if case(14):
				fin_cre[i][0]=fin_cre[i][0][1:]
				break
			if case(16):
				fin_cre[i][0]=fin_cre[i][0][1:]
				break
#			print fin_cre[i]
#Then the username and password is ready, and we should saved it
	with open('Credit.dat','wb') as savedata:
		pickle.dump(fin_cre,savedata)

       里面想用到swtich case结构,就在网上找了个别人写好的类了:

#################################################################
#This class is to implement the struct of swtich```case
#################################################################
    def __init__(self, value):
        self.value = value
        self.fall = False
    def __iter__(self):
        """Return the match method once, then stop"""
        yield self.match
        raise StopIteration
    def match(self, *args):
        """Indicate whether or not to enter a case suite"""
        if self.fall or not args:
            return True
        elif self.value in args: # changed for v1.5, see below
            self.fall = True
            return True
        else:
            return False
	

       再之后就是拨号了:

 

#####################################################################
#           Dial   Start
#####################################################################
	with open('Credit.dat','rb')as resdata:
		credit=pickle.load(resdata)
	i=random.randrange(0,len(credit))
	while True:
		with open('/usr/local/openkeeper/config/user','w')as user_data:
			user_data.write(credit[i][0])
		with open('/usr/local/openkeeper/config/pass','w')as pass_data:
			pass_data.write(credit[i][1])
		if os.system('test -n "`ifconfig|grep ppp`"') == 0:
			print "You have already on the Internet!!!"
			break
		else:
			print "Try to use the count: "+credit[i][0]+" to surfer the Internet"
			result=os.popen('okok').read()
		print result
		i=i+1
		if not result.find("Connected")==-1:
			break
		elif i==len(credit):
			i=random.randrange(0,len(credit))
		print "\nUse the Next Count~~!"'\n'

       这样子,就能实现我们想要的功能了,从上午1030,到下午530,基本上都一直在各种写写调调。

       总结下得到的经验就是:

       1、会多维列表操作了

       2remove() del()方法的区别

       3、知道了些python下字典的操作

       4、知道了python调用shell的几种方法和它们的区别,os.systemos.popencommand.commands、还有个什么给忘了。

       4、知道了一些列表的方法:count()find()、等。

       5、将书上的 pickle.dumppickle.loadtry:except:finally:结构用到了实践中。

发表评论(0)
姓名 *
电子邮件
QQ
评论内容 *
验证码 *图片看不清?点击重新得到验证码请输入图片后链接字符‘a’