以下代码测试单个子网循环的方法:
#!/usr/bin/python
from netmiko import ConnectHandler
from netmiko.ssh_exception import NetMikoTimeoutException
from IPy import IP
import time
import sys
import getpass
import re
import io
import StringIO
class CiscoNetwork():
def __init__(self,username,password):
self.username = username
self.password = password
def CiscoDevice(self,iplist):
self.device={'device_type':'cisco_ios',
'username':self.username,
'password':self.password,
'ip':iplist
}
print('-'*100)
print "[+]connect to network device... %s" %(iplist)
self.connect = ConnectHandler(**self.device)
self.connect.enable()
def gethostname(self):
self.hostname = self.connect.find_prompt()
self.hostname = self.hostname.replace("#","")
print self.hostname
def interfaceInfo(self,cmd):
result = self.connect.send_command(cmd)
for interface in result.split('\n'):
if 'up' in interface:
#print interface
lines=StringIO.StringIO(interface)
data = lines.read()
intername = ' '.join(re.findall('^Eth.+\/\d',data))
loopback = ' '.join(re.findall('Loopback[0-9]',data))
interIP = re.findall( '\.'.join(['\d{1,3}']*4),data)
if intername:
print intername ,':', ''.join(interIP)
else:
print loopback , ':', ''.join(interIP)
def show(self,cmd):
result = self.connect.send_command(cmd)
lines = StringIO.StringIO(result)
data = lines.read()
uptime = re.findall('uptime.+',data)
id = re.findall('\d{8}',data)
soft = re.findall('L3_.+\\.bin',data)
print 'Device UPtime:', ''.join(uptime)
print 'Device ID:', ''.join(id)
print 'Soft Version:',''.join(soft)
def close(self):
if self.connect is not None:
self.connect.disconnect()
self.connect = None
print '[+] Network devices complete all settings!'
if __name__ == '__main__':
print "[+] This Program is beging done......."
#username = raw_input('Username:')
#password = getpass.getpass()
ipadd = IP('10.0.0.0/30')
for ips in ipadd:
ipadds = StringIO.StringIO(ips)
ipadds = '\n'.join(ipadds).splitlines()
for iplist in ipadds:
try:
switch = CiscoNetwork('admin','Password.123')
switch.CiscoDevice(iplist)
switch.gethostname()
switch.interfaceInfo('show ip int brief')
switch.show('show version')
switch.close()
except (EOFError, NetMikoTimeoutException):
print('Can not connect to Device!')
如何是多个子网需增加多一层循环,代码更改如下:
if __name__ == '__main__':
print "[+] This Program is beging done......."
#username = raw_input('Username:')
#password = getpass.getpass()
ipadd = IPSet([IP('10.0.0.0/30'),IP('10.0.1.0/30'),IP('10.0.2.0/30')])
for ips in ipadd:
ipadd = StringIO.StringIO(ips)
ipadds = '\n'.join(ipadd).splitlines()
for ip01 in ipadds:
ip02=IP(ip01)
for ip03 in ip02:
ip03 = StringIO.StringIO(ip03)
ip03 = '\n'.join(ip03).splitlines()
for iplist in ip03:
try:
switch = CiscoNetwork('admin','Password.123')
switch.CiscoDevice(iplist)
switch.gethostname()
switch.interfaceInfo('show ip int brief')
switch.show('show version')
switch.close()
except (EOFError, NetMikoTimeoutException):
print('Can not connect to Device!')