使用Netmiko自动化配置Cisco路由器:SSH连接与命令优化

使用Netmiko自动化配置Cisco路由器:SSH连接与命令优化

本教程详细阐述了如何利用python的netmiko库自动化配置cisco路由器,重点解决ssh连接超时及配置命令错误的问题。文章将指导读者正确构建设备连接参数,优化配置命令发送方式(特别是避免手动输入`enable`和`configure terminal`),并提供完整的代码示例,涵盖接口、ospf配置、配置保存与比较,确保网络自动化脚本的稳定与高效运行。

使用Netmiko自动化配置Cisco路由器:SSH连接与命令优化

在网络管理中,自动化配置能够极大地提高效率并减少人为错误。Python的Netmiko库是实现这一目标的重要工具,它提供了一个简单而强大的接口,用于通过SSH或Telnet连接到各种网络设备并执行命令。然而,在使用Netmiko时,一些常见的误区可能导致连接超时或配置失败。本文将深入探讨如何正确使用Netmiko进行Cisco路由器的SSH连接与配置,并优化配置命令的发送方式。

1. 理解Netmiko的配置模式处理

Netmiko的核心优势之一是它能够智能地处理设备的不同配置模式。当使用net_connect.send_config_set()方法发送配置命令列表时,Netmiko会自动:

进入特权执行模式(如果需要,通过发送enable命令并提供secret密码)。进入全局配置模式(通过发送configure terminal命令)。逐条发送配置列表中的命令。在命令发送完毕后,自动退出全局配置模式。

因此,在send_config_set()的命令列表中,不应手动包含en(或enable)和conf t(或configure terminal)命令。手动添加这些命令会导致Netmiko尝试重复进入已处于的模式,从而可能引发命令解析错误、延迟或连接超时。

错误的配置命令示例(应避免):

loopback_config = [    'enn'  # 错误:Netmiko会自动处理    'conf tn' # 错误:Netmiko会自动处理    'interface Loopback0n',    'ip address 192.168.57.101 255.255.255.0n',    'exitn']

正确的配置命令示例:

loopback_config = [    'interface Loopback0',    'ip address 192.168.57.101 255.255.255.0',    'exit']

请注意,命令末尾通常不需要n,Netmiko会正确发送。

2. 构建设备连接参数

在使用Netmiko连接设备之前,需要定义一个包含设备连接信息的字典。这个字典是ConnectHandler类的关键输入。

琅琅配音 琅琅配音

全能AI配音神器

琅琅配音 208 查看详情 琅琅配音

import getpassfrom netmiko import ConnectHandlerimport logginglogging.basicConfig(level=logging.INFO)def get_device_info():    """    获取用户输入的设备连接信息并构建设备字典。    """    host = '192.168.56.101' # 目标设备的IP地址    username = input('请输入您的用户名: ')    password = getpass.getpass('请输入您的密码: ')    secret = getpass.getpass('请输入特权模式密码 (如果需要): ') # 特权模式密码,通常为enable密码    # 用户选择连接类型    while True:        choice = input('请选择连接类型 (telnet 或 ssh): ').lower()        if choice == 'telnet':            device_type = 'cisco_ios_telnet'            port = 23            break        elif choice == 'ssh':            device_type = 'cisco_ios'            port = 22            break        else:            logging.warning('无效选择,请重新输入 "telnet" 或 "ssh"。')    device = {        'device_type': device_type,        'host': host,        'username': username,        'password': password,        'secret': secret,        'port': port,        'timeout': 100, # 增加超时时间以应对潜在的网络延迟    }    return device

在device字典中:

device_type: 指定设备类型,如cisco_ios(SSH)或cisco_ios_telnet(Telnet)。host: 设备的IP地址。username, password: 用于登录设备的凭据。secret: 进入特权模式(enable)所需的密码。port: 连接端口,SSH默认为22,Telnet默认为23。timeout: 连接或命令执行的超时时间(秒),适当增加有助于避免因网络延迟导致的超时错误。

3. 实现接口与OSPF配置

根据上述原则,我们可以构造正确的配置命令列表,实现Loopback接口、物理接口和OSPF协议的配置。

def configure_device(net_connect):    """    向设备发送配置命令。    """    logging.info('正在发送配置命令...')    # Loopback接口配置    loopback_config = [        'interface Loopback0',        'ip address 192.168.57.101 255.255.255.0',        'no shutdown' # 确保接口启用    ]    # ACL配置 (示例,根据需要调整)    acl_config = [        'ip access-list extended MY_ACL',        'permit ip 192.168.56.130 0.0.0.255 any', # 注意ACL中的通配符掩码        'deny ip any any',        'exit'    ]    # 物理接口GigabitEthernet0/0配置    interface0_config = [        'interface GigabitEthernet0/0',        'ip address 192.168.58.101 255.255.255.0',        'no shutdown'    ]    # 物理接口GigabitEthernet0/1配置    interface1_config = [        'interface GigabitEthernet0/1',        'ip address 192.168.59.101 255.255.255.0',        'no shutdown'    ]    # OSPF配置    ospf_config = [        'router ospf 1', # OSPF进程ID为1        'network 192.168.57.0 0.0.0.255 area 0', # 宣告Loopback0所在网络        'network 192.168.58.0 0.0.0.255 area 0', # 宣告GigabitEthernet0/0所在网络        'network 192.168.59.0 0.0.0.255 area 0', # 宣告GigabitEthernet0/1所在网络        'exit'    ]    # 合并所有配置命令    all_configs = loopback_config + acl_config + interface0_config + interface1_config + ospf_config    # 使用send_config_set发送配置    output = net_connect.send_config_set(all_configs)    print(output)    logging.info('配置命令发送完毕。')

注意事项:

ACL中的255.255.255.0通常表示子网掩码,但在Cisco扩展ACL的permit/deny ip语句中,需要使用通配符掩码(wildcard mask),例如0.0.0.255对应255.255.255.0的子网掩码。no shutdown命令对于接口的启用至关重要。OSPF的network命令需要指定网络地址、通配符掩码和区域ID。

4. 配置保存与比较

自动化脚本通常需要能够保存当前运行配置,并可能与本地存储的配置进行比较,以检测差异。

import difflibdef save_config_to_file(config, filename):    """    将配置内容保存到文件。    """    with open(filename, 'w') as config_file:        config_file.write(config)    logging.info(f'配置已保存到 {filename}')def show_differences(config1_content, config2_content, name1="Config 1", name2="Config 2"):    """    显示两个配置之间的差异。    """    difference = difflib.Differ()    diff = list(difference.compare(config1_content.splitlines(keepends=True), config2_content.splitlines(keepends=True)))    logging.warning(f'配置差异 ({name1} vs {name2}):')    for line in diff:        if line.startswith('- '):            logging.info(f'- {line[2:].strip()}') # 仅在Config 1中存在        elif line.startswith('+ '):            logging.info(f'+ {line[2:].strip()}') # 仅在Config 2中存在        elif line.startswith('? '):            pass # 忽略difflib的提示行

5. 完整的自动化脚本示例

结合上述组件,我们可以构建一个完整的Netmiko自动化脚本。

import loggingimport getpassimport difflibfrom netmiko import ConnectHandler# 配置日志logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')def save_config_to_file(config, filename):    """将配置内容保存到文件。"""    with open(filename, 'w') as config_file:        config_file.write(config)    logging.info(f'配置已保存到 {filename}')def show_differences(config1_content, config2_content, name1="Config 1", name2="Config 2"):    """显示两个配置之间的差异。"""    difference = difflib.Differ()    diff = list(difference.compare(config1_content.splitlines(keepends=True), config2_content.splitlines(keepends=True)))    logging.warning(f'配置差异 ({name1} vs {name2}):')    for line in diff:        if line.startswith('- '):            logging.info(f'- {line[2:].strip()}')        elif line.startswith('+ '):            logging.info(f'+ {line[2:].strip()}')        elif line.startswith('? '):            passdef configure_device(net_connect):    """向设备发送配置命令。"""    logging.info('正在发送配置命令...')    loopback_config = [        'interface Loopback0',        'ip address 192.168.57.101 255.255.255.0',        'no shutdown'    ]    acl_config = [        'ip access-list extended MY_ACL',        'permit ip 192.168.56.130 0.0.0.255 any',        'deny ip any any',        'exit'    ]    interface0_config = [        'interface GigabitEthernet0/0',        'ip address 192.168.58.101 255.255.255.0',        'no shutdown'    ]    interface1_config = [        'interface GigabitEthernet0/1',        'ip address 192.168.59.101 255.255.255.0',        'no shutdown'    ]    ospf_config = [        'router ospf 1',        'network 192.168.57.0 0.0.0.255 area 0',        'network 192.168.58.0 0.0.0.255 area 0',        'network 192.168.59.0 0.0.0.255 area 0',        'exit'    ]    all_configs = loopback_config + acl_config + interface0_config + interface1_config + ospf_config    output = net_connect.send_config_set(all_configs)    print(output)    logging.info('配置命令发送完毕。')def main():    host = '192.168.56.101'    username = input('请输入您的用户名: ')    password = getpass.getpass('请输入您的密码: ')    secret = getpass.getpass('请输入特权模式密码 (如果需要): ')    while True:        choice = input('请选择连接类型 (telnet 或 ssh): ').lower()        if choice == 'telnet':            device_type = 'cisco_ios_telnet'            port = 23            break        elif choice == 'ssh':            device_type = 'cisco_ios'            port = 22            break        else:            logging.warning('无效选择,请重新输入 "telnet" 或 "ssh"。')    device = {        'device_type': device_type,        'host': host,        'username': username,        'password': password,        'secret': secret,        'port': port,        'timeout': 100,    }    try:        # 使用 'with' 语句确保连接正确关闭        with ConnectHandler(**device) as net_connect:            logging.info('连接已建立。')            # 发送配置命令            configure_device(net_connect)            # 保存运行配置            logging.info('正在获取设备的运行配置...')            running_configuration = net_connect.send_command('show running-config')            local_config_file_name = 'local_config.txt'            save_config_to_file(running_configuration, local_config_file_name)            logging.info(f'运行配置已保存到 {local_config_file_name}')            # 比较配置            try:                with open(local_config_file_name, 'r') as local_config_file:                    local_config = local_config_file.read()                if running_configuration and local_config:                    # 简单比较,忽略空白字符和换行符差异                    if running_configuration.strip() == local_config.strip():                        logging.info('运行配置与本地配置一致。')                    else:                        logging.warning('运行配置与本地配置不匹配。')                        show_differences(local_config, running_configuration, "本地配置", "设备运行配置")                else:                    logging.error('无法获取配置内容进行比较。')            except FileNotFoundError:                logging.error(f'本地配置文件 ({local_config_file_name}) 未找到。')    except Exception as e:        logging.error(f'发生错误: {e}')    finally:        logging.info('连接已终止。') # 'with' 语句会自动处理断开连接if __name__ == "__main__":    main()

6. 总结与注意事项

Netmiko智能处理模式切换:核心要点是Netmiko的send_config_set()方法会自动处理enable和configure terminal。避免在命令列表中重复这些命令是解决连接超时和配置错误的关键。错误处理:使用try…except块来捕获可能发生的网络连接或命令执行错误,并提供有用的日志信息。with语句:使用with ConnectHandler(…) as net_connect:结构可以确保Netmiko连接在代码块执行完毕后(无论是否发生异常)自动关闭,避免资源泄露。因此,在with块外部显式调用net_connect.disconnect()是多余且可能导致net_connect未定义的错误。超时设置:根据网络环境和设备响应速度,适当调整timeout参数可以提高脚本的健壮性。配置验证:在发送配置后,通过send_command(‘show running-config’)获取配置并与预期配置进行比较,是验证配置是否成功应用的有效方法。日志记录:良好的日志记录有助于调试和追踪脚本执行过程。

通过遵循这些最佳实践,您可以构建出高效、稳定且易于维护的Netmiko自动化脚本,从而简化Cisco路由器的配置管理任务。

以上就是使用Netmiko自动化配置Cisco路由器:SSH连接与命令优化的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/596899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 18:39:38
下一篇 2025年11月10日 18:40:57

相关推荐

  • Hedera (HBAR币) 价格预测 :2025、2026、2027-2030年

    以下为基于你提供内容的伪原创版本,未改变文章大意,且保留了图片位置: 目录 什么是 Hedera(HBAR)? HBAR 代币经济学 Hedera (HBAR) 2025 年价格预测 Hedera(HBAR)价格分析(信号和指标) Hedera(HBAR)2025-2030年价格目标 Hedera …

    2025年12月8日 好文分享
    000
  • ETH单日暴涨近12%!一般哪些山寨币会跟涨?跟涨山寨币盘点

    目录 ETH 生态基础设施代币:LINK、UNI、MKR、1INCH、CRVETH 生态 Meme 币:MOODENG、DOGE、PEPEETH 传导效应板块代币:AERO、BRETT、TOSHI其他潜在上涨代币:WLD、ENS小结:ETH 上涨后,市场进入心理博弈阶段ETH 最新动态 eth 单日…

    2025年12月8日
    000
  • FLOKI币前景如何?值得投资吗?FLOKI币价格预测 2025,2026-2030

    目录 2. 项目概述3. 项目类别与应用场景a) 具有病毒传播潜力的迷因币层b) DeFi与实用性:FlokiFi生态系统c) 元宇宙与游戏:Valhallad) 教育:Floki大学e) 慈善与现实世界影响使用案例示例4. 市场表现5. 价格分析6. FLOKI价格预测2025-20307. 结论…

    2025年12月8日
    000
  • 超买信号:RSI、随机指标与威廉指标的比较

    在技术分析中,识别超买与超卖状态对交易者判断买卖时机至关重要。相对强弱指数(rsi)、随机指标和威廉指标(williams %r)是三种常用的工具,它们各自具备不同的逻辑、优势和适用环境。 本文将探讨这些指标的定义、运作机制、彼此之间的差异以及使用时机,尤其针对加密货币交易者。 什么是RSI? 相对…

    2025年12月8日
    000
  • 一文详细了解Optimism 如何实现真正的去中心化?

    在过去五年间,dao 的规模、复杂性以及功能能力均实现了显著提升。已有超过 330 万个地址积极参与 dao 的治理与投票流程,dao 国库管理的总资产接近 350 亿美元(数据来源:deepdao)。 尽管 DAO 展现出巨大的潜力,但作为一种新兴的协作形式,它在治理和运营管理方面仍面临诸多挑战。…

    2025年12月8日
    000
  • 以太坊重回3400美元!是牛市起点还是短期躁动?

    以太坊价格再次突破3400美元,市场热议其是否预示牛市开启还是短期波动。——生态治理的博弈:ecf 与 ef 的不同路径。 以太坊此轮上涨背后,一个深层次因素是其内部治理结构的加速调整。 EF 主动变革:从“放任”到“协调者”角色转变。 7月,以太坊基金会(EF)宣布重大组织调整,提出“加速、放大、…

    2025年12月8日
    000
  • 2025年币圈山寨币季何时开始?如何判断?

    目录 什么是山寨币季节? %ignore_a_2%会出现山寨币季节?2025年值得关注的山寨币季节关键指标比特币主导趋势交易量和流动性专家预测:山寨币季节何时开始?山寨币季来临前的交易者策略投资组合多元化掌握可靠数据应对山寨币季的风险与挑战为2025年山寨币季做准备 随着我们进入2025年下半年,交…

    2025年12月8日
    000
  • usdt稳定币是什么?如何购买/出售USDT稳定币?

    usdt,即泰达币,是一种与美元价值挂钩的数字货币。它属于稳定币范畴,旨在保持价格的稳定,避免加密货币市场常见的剧烈波动。usdt的出现,为数字资产交易提供了一个相对稳定的价值储存和交易媒介。它使得投资者在数字资产和法定货币之间进行转换时,能够减少价格波动带来的风险,成为数字货币生态系统中广泛使用的…

    2025年12月8日
    000
  • 一文读懂:公链与私链的区别及其在实际应用中的优劣势

    公链与私链的核心区别在于开放性与控制权。1、公链完全开放,任何人均可参与,具有高度去中心化、透明性,但效率较低、隐私性差,适合需要全球共识的场景,如NFT和DApps;2、私链则由特定组织控制,准入受限,具备高性能、低成本和强隐私保护,适合企业内部或联盟间的应用场景,如供应链管理和数据共享。两者各有…

    2025年12月8日
    000
  • 如何购买和出售USDT?稳定币USDT交易平台推荐

    usdt,即泰达币,是一种与美元价值挂钩的稳定币。其设计初衷是提供一种在数字资产市场中保持价值稳定的加密货币。由于其与美元的固定比率,usdt在波动性较大的加密资产交易中,扮演着重要的桥梁角色。它允许用户在不同数字资产之间进行转换,同时降低了价格剧烈波动的风险。usdt在各大数字资产交易平台中拥有广…

    2025年12月8日
    000
  • 以太坊(ETH)突破3600美元,RSI买入信号 目标价10000美元

    以太坊突破3000美元后持续走强,一位交易员预测本轮周期价格或将触及7000至10000美元区间。 要点: 以太坊价格受ETF资金流入与链上活动增强推动,升至6个月以来的最高水平。4月RSI触及40发出的买入信号,历史数据显示与ETH大幅上涨相关,2025年潜在价格目标或达7000至10000美元。…

    2025年12月8日 好文分享
    000
  • Trusta.AI(TA币)是什么?值得投资吗?TA代币实用性和市场前景分析

    trusta.ai:连接人机时代信任的桥梁 – 链捕手 目录 Trusta.AI是什么?一个用于 AI 输出信任的链上协议 TA Token机制:验证激励与信任治理的核心资产 Trusta.AI核心应用及数据网络 市场定位和增长潜力 风险评估与挑战 技术挑战 市场风险 代币风险 常见问题…

    2025年12月8日
    000
  • Virtuals Protocol(VIRTUAL币)是什么?怎么样?VIRTUAL币价格预测

    在区块链与人工智能深度融合的浪潮中,virtuals protocol 正以创新的姿态重新定义ai经济的未来。该平台基于区块链技术,允许用户创建、共同拥有并货币化自主ai代理(autonomous ai agents),将虚拟实体转化为可在链上交易的资产。 根据Gate行情数据,截至2025年7月1…

    2025年12月8日
    000
  • 什么是PayNet Coin(PAYN币)?PAYN币市场、代币经济学及未来价格预测

    数字支付的发展正在改变我们预订旅行、在线购物和进行国际转账的方式。随着消费者对更快捷、更便宜、更灵活支付手段的需求增加,加密货币正在旅游和电商等领域迅速崛起。无论是用比特币支付酒店费用,还是用稳定币在线购物,加密货币已不再是交易者的专属工具,而是逐渐融入到日常消费中。 PayNet Coin (PA…

    2025年12月8日
    000
  • 什么是迷因币超级周期?迷因币超级周期有哪些特点

    Meme Coin 超级周期是指在市场情绪高涨和投机资金推动下,模因币价格普遍大幅上涨并持续一段时间的现象。其核心特点包括社交驱动增长、高波动与高回报、市场结构变化以及机构资金开始进入。历史上,2017-2018 年 Dogecoin 涨幅超 61000%,2020-2021 年 Shiba Inu…

    2025年12月8日
    000
  • 如何在迷因币超级周期赚钱?有哪些实用技巧

    迷因币超级周期为投资者提供了高回报机会,但也伴随巨大风险。1. 参与预售可抢占先机,以折扣价购入代币并实现账面收益;2. 利用市场情绪进行短线交易,通过社交平台追踪热度提升胜率;3. 积极参与空投,零成本获取潜力代币。此外,实战技巧包括:1. 关注社交媒体动态以捕捉热点;2. 追踪KOL动向判断市场…

    2025年12月8日
    000
  • 当前最火热的炒币平台有哪些?十大交易APP用户体验对比

    数字货币的浪潮席卷全球,吸引了无数渴望参与新经济浪潮的投资者。在加密资产交易的世界里,选择一个合适且可靠的交易平台至关重要。这些平台不仅是买卖数字资产的核心枢纽,更是用户与广阔区块链生态系统之间的关键连接点。一个卓越的交易平台,通常能提供极致流畅的用户操作界面、种类繁多的交易对选择、坚不可摧的安全防…

    2025年12月8日 好文分享
    000
  • 三大因素支撑比特币将在10月达到15万美元

    Cooper Research 预测比特币价格将在2025年10月上旬达到15万美元,较发布报告时价格有约22%的上涨空间,预计9月将先触及14万美元;该预测基于三大因素:1)机构资金持续流入,尤其现货比特币ETF自2024年1月获批以来资金不断涌入,预计2025年中旬将创新高;2)宏观经济环境推动…

    2025年12月8日
    000
  • BTC今日行情查询平台推荐 免费查看比特币美元价格走势网站入口

    本文推荐了多个全球顶尖的BTC价格查询及行情分析平台。1、CoinMarketCap数据全面且覆盖广泛,适合一站式查看价格、市值及历史数据;2、CoinGecko提供信任评分和多维度分析,适合注重数据真实性的用户;3、TradingView拥有顶级图表工具和社交分析网络,适合技术分析爱好者。建议根据…

    2025年12月8日
    000
  • 买eth的美股上市公司有哪些?为什么选择押注 ETH 而非 BTC

    自2025年起,SharpLink Gaming、Bitmine Immersion Tech、Bit Digital 与 BTCS Inc. 四家美股公司通过大规模购入并质押 ETH,开创了“ETH 微策略”。1. 主要公司为 SharpLink(358K ETH)、Bitmine(300.7K …

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信