0. 当前环境
- 外网电脑Python版本:3.8.5(安装后不要删除安装包,以后卸载的时候用这个)
- 外网电脑安装netmiko第三方库:cmd中输入pip install netmiko
- 内网电脑环境:无法搭建python环境,需外网电脑完成后打包成exe使用
- 外网电脑cmd中输入:cd C:\USERS\Admin\DESKTOP\批量配置
- 外网电脑cmd中回车后接着输入:pyinstaller -F telnet.py
- Windows下如何使用tree命令生成目录树
- 未打包的文件结构图
C:\USERS\Admin\DESKTOP\批量配置(注:文件夹存放位置和文件夹名称无所谓)
│ config_cisco.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│ config_h3c.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│ config_huawei.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│ resource.xlsx(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│ telnet.py(注:名称随便起)
│
C:\USERS\Admin\DESKTOP\批量配置(注:文件夹存放位置和文件夹名称无所谓)
│ config_cisco.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│ config_h3c.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│ config_huawei.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│ resource.xlsx(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│ telnet.spec(打包exe产生的)
│
├─build(打包exe产生的)
│ └─telnet
│ │ Analysis-00.toc
│ │ base_library.zip
│ │ EXE-00.toc
│ │ PKG-00.toc
│ │ PYZ-00.pyz
│ │ PYZ-00.toc
│ │ telnet.pkg
│ │ warn-telnet.txt
│ │ xref-telnet.html
│ │
│ └─localpycs
│ pyimod01_archive.pyc
│ pyimod02_importers.pyc
│ pyimod03_ctypes.pyc
│ pyimod04_pywin32.pyc
│ struct.pyc
│
└─dist(打包exe产生的)
telnet.exe(最后内网使用的是这个exe文件,只用把这个exe复制出来,使用就好)
1. python环境搭建
- 安装:安装python3.x版本,新点比较好
- 卸载:最好是找到python该版本的官方安装包,点击安装包上的卸载
- 多版本安装:比较复杂,之前如果下载安装过python2.x版本,最好直接装python3.x版本
- 安装第三方库报错可参考
- 内网环境使用,搭建python环境较为繁琐,可以将python脚本打包成exe使用
2. 相关文件和代码
2.1 resource.xlsx
- 表头和表中内容如图所示(以H3C设备为例)
- Cisco设备的type:cisco_ios
- H3C设备的type:hp_comware
- Huawei设备的type:huawei
2.2 config_h3c.txt
- 只需要直接开始敲命令就好,不用输入en进入特权模式然后conf t(针对Cisco),也不用输入保存命令
2.3 telnet.py
- 华为设备的保存命令比较特别,其他设备可以按照代码中的华为保存命令自己调整
from netmiko import ConnectHandler, exceptions
from openpyxl import load_workbook
import time
date = time.strftime('%Y%m%d', time.localtime()) #赋予date变量
# 读取excel内设备列表信息
def check_and_get_dev_list(filename, sheet_name):
excel_information = []
sheet_header = []
wb = load_workbook(filename)
sh = wb[sheet_name]
# 获取最大行数
row = sh.max_row
# 获取最大列数
column = sh.max_column
data = []
# 获取表头写入列表中方便调用
for data_1 in range(1, column+1):
get_sheet_header = sh.cell(row=1, column=data_1).value
sheet_header.append(get_sheet_header)
# 第一行为表头, 此处 row +1 是pyton循环时不读取最后一个数
for row_1 in range(2, row + 1):
# 存储一行信息
sheet_data_1 = dict()
# 逐行读取表中的数据
for b in range(1, column + 1):
cell = sh.cell(row=row_1, column=b).value
# 将数据已字典形式写入 sheet_data_1 中
# if cell != None:
sheet_data_1[sheet_header[b-1]] = cell
excel_information.append(sheet_data_1)
for i in excel_information:
if i['ip'] != None:
data.append(i)
return data
#获取excel数据并整合成dev字典
def get_dev():
res = check_and_get_dev_list('./resource.xlsx', 'Sheet1')
devices = []
for i in res:
if i['protocol'] == 'telnet':
i['type'] = i['type']+'_telnet'
dev = {'device_type':i['type'],
'host': i['ip'],
'username': i['username'],
'password': i['password'],
'secret': i['enpassword'],
'port': i['port'],}
devices.append(dev)
return devices
# 批量配置交换机
def devices_add_conf(devices=''):
# 循环登录设备添加配置
for dev in devices:
try:
with ConnectHandler(**dev) as connect:
print('\n----------成功登录到:' + dev['host'] + '----------')
connect.enable()
if 'cisco_ios' in dev['device_type']:
output = connect.send_config_from_file('config_cisco.txt')
print(output)
save_output = connect.save_config()
print(save_output)
elif 'huawei' in dev['device_type']:
output = connect.send_config_from_file('config_huawei.txt')
print(output)
save_output = connect.save_config(cmd='save',confirm=True,confirm_response='y')
print(save_output)
save_output = connect.save_config(cmd='y',confirm=True)
print(save_output)
save_output = connect.save_config(cmd='\n',confirm=True)
print(save_output)
elif 'hp_comware' in dev['device_type']:
output = connect.send_config_from_file('config_h3c.txt')
print(output)
save_output = connect.save_config()
print(save_output)
else:
print('error')
# 连接异常处理
except exceptions.NetmikoAuthenticationException:
e1 = open(f'{date}.txt','a')
print(date,dev['host'],'[Error 1] 登录验证失败!\n',file = e1)
e1.close
continue
except exceptions.NetmikoTimeoutException:
e2 = open(f'{date}.txt','a')
print(date,dev['host'],'[Error 2] 超时,目标不可达!\n',file = e2)
e2.close
continue
except exceptions.ReadTimeout:
e3 = open(f'{date}.txt','a')
print(date,dev['host'],'[Error 3] 读取超时,请检查enable密码是否正确!\n',file = e3)
e3.close
continue
except:
e4 = open(f'{date}.txt','a')
print(date,dev['host'],'[Error 4] Unknown error.\n',file = e4)
e4.close
continue
return 1
# 运行主程序
if __name__ == '__main__':
dev = get_dev()
devices_add_conf(devices=dev)
3. 使用H3C模拟器简单测试
- 可以使用H3C模拟器进行简单测试(相当于电脑和模拟器中的两个交换机在同一网段)
- 模拟器中的两个交换机配置telnet
telnet server enable
local-user h3c class manage
password simple h3c123456789
service-type telnet
authorization-attribute user-role network-operator
authorization-attribute user-role level-15
line vty 0 4
authentication-mode scheme
user-role network-admin
user-role network-operator
- 通过电脑的cmd可以telnet连接到这两个交换机
4. 验证
- 可以看到运行程序后的窗口中,显示保存成功
- 将各厂商的路由器交换机原本保存成功的提示放在了窗口,各厂商的提示略有不同
- 登录交换机,比较当前配置与下次启动的配置文件的差别
- 华为:compare configuration
- H3C:display current-configuration diff
- 可以简单看一下
5. 参考文献——netmiko的使用
5.1 netmiko简单使用
5.2 netmiko复杂讲解
'device_type': 'huawei_serial', # 指定设备类型,串口方式登陆,默认连接COM1,波特率9600
'device_type': 'huawei_telnet', # 指定设备类型,该类型适用于huawei设备,telnet方式
'device_type': 'huawei', # 该类型适用于huawei设备,ssh方式
5.3 使用netmiko后保存交换机配置
5.4 使用netmiko后的输出显示(目前没有该方面的困扰,程序能跑起来就很不错了😂)
6. 如用的参考文献
6.1 import paramiko
6.2 import telnetlib/telnetlib3
6.2.1 简单(import telnetlib)
6.2.2 复杂(import telnetlib3)
6.3 奇怪的python用法(如用,感觉用处不大)
7. 总结与展望