Python 的pexpect 破解主机密码

4 篇文章 0 订阅
3 篇文章 0 订阅

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捕获信息情况,可以进行自定义的,不过最多可以定义四个正则参数,要对用到的参数进行优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值