必须确认三件事:①交换机已启用SSH服务(如华为执行ssh server enable);②账号具备最高权限(如Cisco需level 15、华为需super 15);③网络可达且防火墙放行TCP 22端口,须用ping和telnet验证。

用 netmiko 连交换机前必须确认的三件事
直接写脚本连交换机却连不上?大概率卡在这三个地方:netmiko 不支持你设备的厂商/型号、SSH 服务没开、或账号没权限。先确认:① 交换机是否启用 ssh server enable(华为/H3C)或 ip ssh server(Cisco IOS);② 用户必须有 level 15(Cisco)或 super 15(华为)权限,普通只读账号无法执行 display current-configuration 或 show running-config;③ 网络可达且防火墙放行 TCP 22 端口——别跳过 ping 和 telnet 测试。
备份命令因厂商差异必须硬编码判断
同一段 Python 脚本不能对所有交换机发同一个命令。Cisco IOS 用 show running-config,华为用 display current-configuration,H3C 用 display current-configuration 但需加 force 参数防分页,Juniper 则要进 configure 模式后执行 show | display set。所以脚本里得按 device_type 分支处理:
if device['device_type'] == 'cisco_ios':
config = conn.send_command('show running-config')
elif device['device_type'] == 'huawei':
config = conn.send_command('display current-configuration', read_timeout=30)
elif device['device_type'] == 'hp_comware':
config = conn.send_command('display current-configuration force')
注意 read_timeout 必须设大些,否则华为/H3C 配置长时会超时抛 NetMikoTimeoutException。
保存文件名必须包含设备 IP 和时间戳
备份文件如果只叫 config.txt,下周就分不清哪份是哪台的。命名规则必须固化:{ip}_{timestamp}.cfg,其中 timestamp 用 datetime.now().strftime('%Y%m%d_%H%M%S')。别用 time.time()——数字串难读;也别漏掉 ip,否则批量备份后根本没法定位源设备。示例:
立即学习“Python免费学习笔记(深入)”;
filename = f"{device['host']}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.cfg"
with open(f"backups/{filename}", "w") as f:
f.write(config)
路径 backups/ 要提前用 os.makedirs("backups", exist_ok=True) 创建,否则首次运行报 FileNotFoundError。
连接失败时别让整个脚本静默退出
netmiko.ConnectHandler 抛异常时,如果只用 except Exception: 吞掉错误,你会以为“备份成功了”,其实一台都没连上。必须区分异常类型并打印关键信息:
-
NetMikoAuthenticationException→ 检查账号密码或 AAA 认证配置 -
NetMikoTimeoutException→ 检查 SSH 是否启用、IP 是否填错、网络延迟是否过高 -
EOFError→ 设备主动断连,常见于配置了idle-timeout或 ACL 限流
每种情况都 print 出设备 IP 和错误类名,方便快速定位。别依赖日志文件——运维半夜收到告警,第一眼就要看到错在哪台。
真正在生产环境跑,还得加重试机制(比如 max_retries=2)、并发控制(ThreadPoolExecutor 限制 10 线程以内),否则同时连 50 台交换机会被厂商设备限速甚至封 SSH。这些不是锦上添花,是避免备份任务集体失败的关键细节。


















