使用python netmiko模块批量配置Cisco、华为、H3C路由器交换机(支持 telnet 和 ssh 方式)

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环境搭建

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. 验证

5. 参考文献------netmiko的使用

5.1 netmiko简单使用

5.2 netmiko复杂讲解

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. 总结与展望

相关推荐
测试老哥3 分钟前
功能测试干了三年,快要废了。。。
自动化测试·软件测试·python·功能测试·面试·职场和发展·压力测试
爱吃油淋鸡的莫何3 分钟前
Conda新建python虚拟环境问题
开发语言·python·conda
网络研究院9 分钟前
攻击者将恶意软件分解成小块并绕过您的安全网关
网络·网关·安全·攻击·技术·分块·分析
闲人编程11 分钟前
Python实现日志采集功能
开发语言·python·fluentd·filebeat·日志采集
2401_8628867820 分钟前
蓝禾,汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推
前端·c++·python·算法·游戏
luthane22 分钟前
python 实现armstrong numbers阿姆斯壮数算法
python·算法
昕er35 分钟前
Python 中自动打开网页并点击[自动化脚本],Selenium
python·selenium·自动化
小哈里36 分钟前
【云网络】软件定义网络SDN的概念与应用(以PVE8用户隔离,TLS证书介绍,自签证书等为例)
网络·https·云计算·虚拟化·sdn
风控牛41 分钟前
【chromedriver编译-绕过selenium机器人检测】
java·python·selenium·测试工具·安全·机器人·行为验证