网络设备配置备份(SSH / Telnet)
用途
批量把交换机、路由器、防火墙的当前配置取回本地归档,用于变更留底、故障回滚、
合规留痕与配置基线对比。
覆盖四类需求:
- 批量备份 —— 给一份设备清单(CSV/JSON),一次跑完全网设备。
- 单台快取 —— 临时取某台设备配置,用于排障或改配置前留底。
- 连通性核查 —— 只探端口可达性,不登录、不落盘。
- 多厂商适配 —— 华为/H3C/思科/锐捷/中兴/深信服/山石/飞塔/迪普,自动匹配导出命令。
执行完成后必须给出结论性汇总(成功几台、失败几台、失败原因分类、归档在哪),
而不是把原始输出丢给用户。
先决条件
依赖隔离环境已预置(netmiko + paramiko)。运行前确认可导入:
"C:/Users/Administrator/.workbuddy/binaries/python/envs/netbackup/Scripts/python.exe" -c "import netmiko; print(netmiko.__version__)"
若报 ModuleNotFoundError,按 references/setup.md 重建环境。
切勿改用系统 Python 或全局环境安装依赖。
决策流程
按用户意图选择模式。
场景 A:批量备份(最常用)
第一步:准备设备清单(CSV)。首行为表头,大小写不敏感,支持中文表头:
ip,type,username,password,name,group
10.20.1.1,huawei,admin,,core-sw-01,总部机房
10.20.1.2,h3c,admin,,dist-sw-02,总部机房
192.168.10.1,fortigate,admin,,fw-edge-01,边界
172.16.0.1,cisco,admin,,core-rt-01,灾备中心
| 列 | 必填 | 说明 |
|---|---|---|
ip |
是 | 管理地址。别名 host / 地址 / IP地址 |
type |
否 | 设备类型,可写 -t 取值或中文别名(华为、锐捷)。留空或 auto 即自动识别,新环境推荐留空 |
username |
否 | 可留空,交由 --creds 或交互输入补齐 |
password |
否 | 同上;建议留空,走凭据文件 |
name |
否 | 展示名,留空则用 IP |
group |
否 | 分组,决定归档子目录(按机房/站点) |
port / protocol |
否 | 非标准端口或强制协议时填 |
第二步:准备凭据(JSON)。无人值守定时备份必须用这个,避免密码进命令行历史:
{
"default": {"username": "netops", "password": "xxx", "enable": "xxx"},
"192.168.10.1": {"username": "admin", "password": "yyy"},
"灾备中心": {"username": "ciscoops", "password": "zzz"}
}
匹配优先级:default < 分组 < IP/名称。清单内已填字段优先于凭据文件。
第三步:执行。
cd "C:/Users/Administrator/.workbuddy/skills/net-device-backup"
# 交互输入密码(人工场景,密码不落盘)
python scripts/net_device_backup.py --file devices.csv --ask-password
# 凭据文件(定时任务、无人值守)
python scripts/net_device_backup.py --file devices.csv --creds creds.json
# 指定归档目录、提高并发、生成 Markdown 报告
python scripts/net_device_backup.py --file devices.csv --creds creds.json \
-o "D:\NetworkBackup" --workers 16 --report backup-report.md
# 先干跑验证清单与连通性,不实际登录
python scripts/net_device_backup.py --file devices.csv --creds creds.json --dry-run
场景 B:单台设备快取
# 华为交换机,交互输入密码
python scripts/net_device_backup.py -d 10.20.1.1 -t huawei -u admin --ask-password
# 思科,自动识别类型
python scripts/net_device_backup.py -d 172.16.0.1 -t auto -u admin --ask-password
# 指定分组便于归档
python scripts/net_device_backup.py -d 10.20.1.1 -t h3c -u admin -g 总部机房 --ask-password
场景 C:连通性核查(不登录、不落盘)
批量备份前的预检,或排查「为什么某几台备不了」。
python scripts/net_device_backup.py --file devices.csv --probe-only --workers 32
输出每台设备 SSH(22) / Telnet(23) 的可达情况。
这一步把「网络不通」和「认证失败」彻底分开,是排障的关键分界。
场景 D:查看支持的设备类型
python scripts/net_device_backup.py --list-types
关键参数
| 参数 | 说明 |
|---|---|
-f/--file |
设备清单(CSV/JSON) |
-d/--device |
单台设备地址(与 --file 互斥) |
-t/--type |
设备类型,auto 自动识别(默认) |
-u/--username |
用户名,可覆盖清单 |
--ask-password |
交互安全输入密码 |
--creds |
凭据 JSON 文件 |
--enable |
enable 特权密码(思科等需要时) |
--protocol |
auto(默认,SSH 优先)/ ssh / telnet |
--ssh-port / --telnet-port |
端口,默认 22 / 23 |
--timeout |
连接与探测超时秒数,默认 6。跨网段调到 10 |
--workers |
并发设备数,默认 8。老设备建议 4–8,防止会话被踢 |
-o/--outdir |
备份根目录,默认 D:\NetworkBackup |
--no-extras |
不保存版本/接口等附加信息 |
--probe-only |
仅探连通性 |
--dry-run |
只做连通性预检,不实际登录 |
--report |
生成 Markdown 汇总报告 |
--json |
额外输出 JSON 结果(便于二次处理) |
-v/--verbose |
打印连接过程 |
归档结构
D:\NetworkBackup\
└── 20261026-173000\ # 批次时间戳
├── _backup_summary.txt # 本批次汇总(成功/失败明细)
├── 总部机房\ # group 分组
│ ├── core-sw-01\
│ │ ├── running-config.txt # 主配置(含归档表头)
│ │ └── device-info.txt # 版本、接口等附加信息
│ └── dist-sw-02\
└── 边界\
└── fw-edge-01\
按批次分目录的好处:不同时间的配置天然隔离,可直接与上一次 diff 做变更审计。
执行后的报告要求
跑完必须向用户交代以下内容,不能只贴原始输出:
- 总体结果:成功 / 失败 / 总数,耗时。
- 失败分类归因(重点):
- 端口不可达 → 网络/ACL/设备离线,需查链路
- 认证失败 → 账号密码问题,注意可能触发登录锁定
- 已连接但取不到配置 → 命令不适配,需用-t补类型或手工确认导出命令 - 归档路径:告诉用户配置存到哪了。
- 后续建议:失败设备的具体下一步动作。
常见问题与处理
| 现象 | 原因 | 处理 |
|---|---|---|
| 全部设备端口不可达 | 本机到管理网不通 / ACL 拦截 | 先 --probe-only 确认,再查网络 |
| 部分设备认证失败 | 密码错 / 账号被锁 / 未配 SSH | 核对账号,或 --protocol telnet 降级 |
| 连接成功但配置为空 | 厂商命令不匹配 | 用 -t 明确指定类型 |
配置被 ---- More ---- 截断 |
分页未关闭 | 脚本已自动发分页命令;仍出现见 references/troubleshooting.md |
| SSH 报算法不支持 | 老设备用弱加密算法 | 见 references/troubleshooting.md 算法协商章节 |
| 并发太高导致设备掉线 | 设备 CPU/会话数限制 | --workers 4 降并发 |
| 深信服/山石取不到配置 | 多数需 Web 控制台导出 | 见 references/troubleshooting.md 专用设备章节 |
安全与合规
- 不要把密码写在命令行
-p参数里(会进 shell 历史与进程列表)。
优先--ask-password或--creds文件。 - 凭据文件放在受控目录,勿提交进代码仓库。
- 使用 Telnet(明文传输)时确认已在受控内网,并在报告中提示该风险。
- 备份文件含设备完整配置(可能含密钥/密码哈希),按敏感数据管理,勿随意外发。
参考文档
references/setup.md—— 环境依赖安装与常见坑references/troubleshooting.md—— 厂商专项排障、算法协商、特殊设备处理references/device-types.md—— 全设备类型命令对照表
自检
改动脚本后跑自测,确保核心逻辑未被破坏:
python scripts/selftest.py
覆盖清单解析、凭据合并、协议选择、回显清理、完整备份流程、失败场景、报告生成。