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