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

相关推荐
凛铄linshuo25 分钟前
爬虫简单实操2——以贴吧为例爬取“某吧”前10页的网页代码
爬虫·python·学习
牛客企业服务28 分钟前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
胡斌附体40 分钟前
linux测试端口是否可被外部访问
linux·运维·服务器·python·测试·端口测试·临时服务器
愚润求学1 小时前
【Linux】自旋锁和读写锁
linux·运维
大锦终1 小时前
【Linux】常用基本指令
linux·运维·服务器·centos
知北游天1 小时前
Linux:多线程---深入互斥&&浅谈同步
linux·运维·服务器
Gappsong8741 小时前
【Linux学习】Linux安装并配置Redis
java·linux·运维·网络安全
likeGhee1 小时前
python缓存装饰器实现方案
开发语言·python·缓存
项目題供诗2 小时前
黑马python(二十五)
开发语言·python
读书点滴2 小时前
笨方法学python -练习14
java·前端·python