您的位置:首页 > 编程语言 > Python开发

Python 的pexpect 破解主机密码

2016-05-23 18:05 471 查看
1.在进行编写程序之前,我并不知道paramiko模板,其功能可以将ssh进行封装,类似的还有pxssh模板,该模板是基于pexpect模块。但是我仍旧选择pexpext进行编写,虽然很low,各位看官不要介意哦

2.程序展示部分

#!/usr/bin/python

import pexpect

#define passwd

passwd=['1234567,'23boabv','agiobnab']

#定义类模板

class DeviceInfo(object):

#初始化类变量
def __init__(self,ip,pwd):

self.ip=ip
self.pwd=pwd

#获取正确的密码
def get_passwd(self):

global password
password=''
ssh=pexpect.spawn('ssh root@{0}'.format(self.ip),timeout=3)
for pw in self.pwd: 
id=ssh.expect(['password:','continue connecting (yes/no)?',\
pexpect.TIMEOUT,pexpect.EOF])
if id==1:
ssh.sendline('yes')
ssh.sendline(pw)
hopeid1=ssh.expect(['password:','~]#',pexpect.TIMEOUT,pexpect.EOF])
if hopeid1==1:
password=pw
break
else:
print pw+' is error [1]'
continue

elif id==0 or id==2:
ssh.sendline(pw)
hopeid2=ssh.expect(['password:','~]#',pexpect.TIMEOUT,pexpect.EOF])
if hopeid2==1:
password=pw
break
else:
print pw+' is error [0] [2]'
continue
elif id==3:
ssh=pexpect.spawn('ssh root@{0}'.format(self.ip),timeout=3)
ssh.expect(['password:','continue connecting (yes/no)?',\
pexpect.TIMEOUT,pexpect.EOF])
ssh.sendline(pw)
hopeid3=ssh.expect(['password:','~]#',pexpect.TIMEOUT,pexpect.EOF])
print hopeid3
if hopeid3==1:
password=pw
break
else:
print pw+' is error [3]'
continue

else:
print 'all passwd is error'
password='error'
ssh.close()
pexpect.EOF(ssh)
return password

#获取正确的主机名
def get_hostname(self):

# global hostname
hostname=''
host_pwd=password

# host_pwd=self.get_passwd()
ssh=pexpect.spawn('ssh root@{0} "cat /etc/sysconfig/network"'.format(self.ip),timeout=3)
id=ssh.expect(['password:','continue connecting (yes/no)?'])
if id==0:
ssh.sendline(host_pwd)
for line in ssh.readlines():
if 'HOSTNAME' in line:
hostname=''.join(line.split('=')[1:])
else:
continue
else:
print 'hostname passwd is error '
ssh.close()
pexpect.EOF(ssh)
hostname=''.join(hostname.split('\r')[:-1])
return hostname

#获取磁盘信息
def get_diskinfo(self):

# global diskinfo
diskinfo=[]
host_pwd=password

# host_pwd=self.get_passwd()
ssh=pexpect.spawn('ssh root@{0} "df -Th"'.format(self.ip),timeout=3)

                id=ssh.expect(['password:','continue connecting (yes/no)?'])

                if id==0:

                        ssh.sendline('{0}\n'.format(host_pwd))

                        for line in ssh.readlines():

                        if 'ext4' in line:

                                diskinfo.append(line.split()[1:])

                                else:

                                        continue

                else:

                        print 'disk passwd is error '
ssh.close()
pexpect.EOF(ssh)
return diskinfo

#获取主机路由
def get_routeinfo(self):

routeinfo=''
host_pwd=password
# host_pwd=self.get_passwd()
ssh=pexpect.spawn('ssh root@{0} "route -n"'.format(self.ip),timeout=3)

                id=ssh.expect(['password:','continue connecting (yes/no)?'])

                if id==0:

                        ssh.sendline(host_pwd)

                        for line in ssh.readlines():

                                if 'UG' in line:

                                        routeinfo=''.join(line.split()[1])

                                else:

                                        continue

                else:

                        print 'route  passwd is error '

                ssh.close()

                pexpect.EOF(ssh)

                return routeinfo

#获取dns信息
def get_dnsinfo(self):

dnsinfo=[]
host_pwd=password
# host_pwd=self.get_passwd()

                ssh=pexpect.spawn('ssh root@{0} "cat /etc/resolv.conf"'.format(self.ip),timeout=3)

                id=ssh.expect(['password:','continue connecting (yes/no)?'])

                if id==0:

                        ssh.sendline(host_pwd)

                        for line in ssh.readlines():

                                if 'nameserver' in line:

                                        dnsinfo.append(line.split()[1])

                                else:

                                        continue

                else:

                        print 'route  passwd is error '

                ssh.close()

                pexpect.EOF(ssh)
dnsinfo=' '.join(dnsinfo)

                return dnsinfo

#运行主程序

if '__main__'==__name__:
fd1=open('guomen_sec','rb')
iplist=fd1.readlines()
for ip1 in iplist:
ip=ip1.strip()
print ip
device=DeviceInfo(ip,passwd)
password=device.get_passwd()
if password=='error':
fd=open('device.txt','a+')
fd.writelines('HOSTIP   : {0}\n'.format(ip))
fd.writelines('HOSTIP   : IS ERROR\n')
fd.writelines('\n')
fd.close()
continue
hostname=device.get_hostname()
diskinfo=device.get_diskinfo()
routeinfo=device.get_routeinfo()
dnsinfo=device.get_dnsinfo()
fd=open('device.txt','a+')
fd.writelines('HOSTIP   : {0}\n'.format(ip))
fd.writelines('HOSTPASS : {0}\n'.format(password))
fd.writelines('ROUTE: {0}\n'.format(routeinfo))
fd.writelines('DNS: {0}\n'.format(dnsinfo))
fd.writelines('HOSTNAME : {0}\n'.format(hostname))
for disk in diskinfo:
if 'ext4' in disk:
disk.remove('ext4')
everydisk=' '.join(disk)
fd.writelines('{0}\n'.format(everydisk))
else:
everydisk=' '.join(disk)
fd.writelines('{0}\n'.format(everydisk))
else:
fd.writelines('\n')
fd.close()
fd1.close()

3.最后还要说一句,pexpect模块真的很low,如果服务器过多会导致time_wait连接数过多,导致获取服务器信息失败,建议还是使用paramiko。

4.各位看官要注意,根据exepct捕获信息情况,可以进行自定义的,不过最多可以定义四个正则参数,要对用到的参数进行优化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: