功能:使用netmiko模块,ssh远程连接整个网络的所以交换机,所有交换机ssh账户和密码一致,ssh登录交换机后执行dis cu 命令,查询所以配置并把查询的信息保存为以当前交换机名字命名的文件,有多少个交换机就保存出来多少个文件,这样可以简化很多操作,避免让我一台台交换机登录去执行命令并保存。注意如果是执行操作命令,例如开端口,还需要多一步保存的操作,我这不需要就没有保存
代码如下:
在这里插入代码片
#使用netmiko模块批量远程登录华为交换机,先ssh登录,登录失败telnet登录,然后批量执行命令
from netmiko import ConnectHandler #使用模块里的连接功能
username=input("输入账号:").strip() #strip()函数自动删除你输入的多余的空格
password=input("输入密码:").strip()
with open("需要测试ip列表.txt") as f: #打开ip列表文件,查看你所要测试的所有ip
ip_list=f.read().splitlines()
print(ip_list)
commonds=['dis ip int br','dis current','dis vlan']
#把你要进去交换机所有执行的命令存放成一个列表,然后赋值一个一个变量commonds列表
for ip in ip_list: #循环,当远程连接的IP属于你的IP列表里,就要执行下面命令,如果不是文件里的就不用执行,这样可以遍历所以你需要的交换机
try: #try命令尝试执行下面命令,失败就执行except下命令
#定义一个字典device,里面有交换机设备的类型,IP,用户名,密码,端口,记住里面的值都得是str类型
device={
'device_type':'huawei', #类型,有思科,华为....
'ip':ip, #后面IP是个变量,前文有赋值这个变量
'username':username,
'password':password,
'port':'22',
}
with ConnectHandler(**device) as net_conncet: #使用with 执行这个连接功能,使用变量device,并将最后的值赋值给变量net_conncet
print(device['ip']+"这个交换机已经SSH远程登录成功"+",对应端口为:"+device['port'])
# 针对上文赋值的变量net_conncet,对它执行交换机内部你需要的操作,net_connect.send_config_set() 将配置命令发送到远程设备 #有很多命令,不同的执行命令有不同操作
#send_command是只能操作把一条命令输入到交换机内,split()分离查询的结果,得到2个部分,后半部分 split()[1]即为主机名
hostname = net_conncet.send_command("dis current-configuration | include sysname").split()[1]
output=net_conncet.send_config_set(commonds) #将所有配置命令commonds发送到远程设备
net_conncet.disconnect()#关闭链接
print(output)
filename=f"{hostname}.txt" #创建一个文件,命名以前文查询到的每个交换机的名字命名
with open(filename,"a") as f: #“a”表示以追加的方式打开文件,并把output的值写入这个文件,注意这里最好用a, # 不能用平常的w模式,w模式保存的文件会覆盖前文
f.write(output)
except:
device = {
'device': 'huawei_telnet',
'ip': ip,
'username': username,
'password': password,
'port': 23,
}
with ConnectHandler(**device) as con:
print(device['ip'] + "这个交换机无法SSH远程登录,只能telnet登录" + ",对应端口为:" + device['port'])
output = con.send_config_set(commonds)
print(output)
con.disconnect()
python里最后执行的效果就是这样,我这里就实验了2个交换机,打开其中一个文件内容大概如下,这样就成功了,是不是少了很多工作,我之前不知道都是一个个交换机去登录,查询然后保存很费时间,这样只用一个代码就简单了。又会了一点简单的操作,给大家分享一下