优质文章,及时送达

转载请注明以下内容:
来源:公众号【网络技术干货圈】
作者:圈圈
ID:wljsghq
以前啊,我最怕的就是月底审计要配置备份。几十台华为、华三、思科的路由器交换机,一台一台telnet或者SSH上去,敲display current-configuration或者show running-config,然后手动复制粘贴保存到U盘……哎哟,敲到手软不说,万一漏一台或者版本不对,领导问起来我只能尴尬笑。
后来我琢磨:为啥不让Python帮我干呢?它24小时不睡觉,定时自动跑,备份完还给我发个邮件说“老李,今天一切OK”。结果呢?现在我每周只花5分钟检查一下备份文件夹,剩下的时间可以喝茶看文档。
网络设备配置就像咱们的“家底”,一旦丢了,后果很严重。我以前就吃过亏:有一次核心交换机重启,配置没保存,重启后全没了。客户业务中断了2小时,我跟同事俩人熬夜手动恢复,领导在旁边急得直转圈。从那以后,我下定决心:备份必须自动化!
好处太多了:
- 支持华为(VRP)、华三(Comware)、思科(IOS/NX-OS)三种主流设备,一套代码全搞定
- 还能顺便检查配置有没有偷偷改动(后面会讲diff对比)
简单说,省时间、省心、还能在领导面前露一手“自动化牛人”。
准备工作:5分钟搞定环境(超简单)
别担心,不用装一大堆东西。
- Python:装3.8以上就行,我用的是3.11。官网下载或者用Anaconda,都行。
在命令行敲:
pip install netmiko pyyaml

Netmiko专门为网络设备设计的,支持100+种厂商,包括咱们的华为、华三、思科。它帮你处理了SSH登录、命令发送、分页问题,简直是懒人福音。
- 设备清单:我推荐用YAML文件存设备信息(比Excel好看多了)。新建一个devices.yaml,内容像这样:
devices: - host: 192.168.1.1 device_type: cisco_ios username: admin password: yourpassword secret: enablepassword # Cisco需要enable模式 - host: 192.168.1.2 device_type: huawei username: admin password: yourpassword - host: 192.168.1.3 device_type: hp_comware # 华三用这个 username: admin password: yourpassword
密码明文不安全?后面我会教你用getpass或者keyring加密。
核心脚本:从最简单版开始写
咱们一步步来。先写一个能备份单台设备的脚本,跑通了再扩展。
新建backup.py,代码我直接贴出来(复制粘贴就能用):
from netmiko import ConnectHandlerfrom datetime import datetimeimport os# 设备信息device = { 'device_type': 'cisco_ios', # 改成huawei或hp_comware试试 'host': '192.168.1.1', 'username': 'admin', 'password': 'yourpassword', 'secret': 'enablepassword', # Cisco专用}# 连接设备net_connect = ConnectHandler(**device)net_connect.enable() # 进入特权模式# 备份命令(不同厂商不一样)if device['device_type'] == 'cisco_ios': output = net_connect.send_command('show running-config')elif device['device_type'] == 'huawei': output = net_connect.send_command('display current-configuration')elif device['device_type'] == 'hp_comware': output = net_connect.send_command('display current-configuration')# 保存文件today = datetime.now().strftime('%Y%m%d_%H%M')hostname = net_connect.find_prompt().strip('#>')filename = f"{hostname}_{today}.cfg"os.makedirs('backups', exist_ok=True)with open(f'backups/{filename}', 'w', encoding='utf-8') as f: f.write(output)print(f"✅ 备份成功!文件:{filename}")net_connect.disconnect()
跑一下试试!看到“备份成功”四个字,是不是超级有成就感?
我当时第一次跑通的时候,高兴得直接截图发群里了😂
多设备+定时运行:真正实现“自动”
单台太弱了,咱们改成批量。把devices.yaml读进来,循环就行。
完整版代码(我已经帮大家优化好了):
import yamlfrom netmiko import ConnectHandlerfrom datetime import datetimeimport osimport logging# 设置日志logging.basicConfig(filename='backup.log', level=logging.INFO)def backup_device(dev): try: net_connect = ConnectHandler(**dev) net_connect.enable() # 根据厂商选命令 cmd = { 'cisco_ios': 'show running-config', 'huawei': 'display current-configuration', 'hp_comware': 'display current-configuration' }.get(dev['device_type'], 'show running-config') output = net_connect.send_command(cmd) net_connect.disconnect() # 保存 today = datetime.now().strftime('%Y%m%d_%H%M') hostname = dev['host'].replace('.', '_') filename = f"backups/{hostname}_{today}.cfg" os.makedirs('backups', exist_ok=True) with open(filename, 'w', encoding='utf-8') as f: f.write(output) logging.info(f"✅ {dev['host']} 备份成功") return True except Exception as e: logging.error(f"❌ {dev['host']} 备份失败: {str(e)}") return False# 主程序with open('devices.yaml') as f: devices = yaml.safe_load(f)['devices']success_count = 0for dev in devices: if backup_device(dev): success_count += 1print(f"🎉 本次备份完成!成功{success_count}/{len(devices)}台")
定时怎么搞?
0 2 * * * /usr/bin/python3 /path/to/backup.py # 每天凌晨2点跑
- Windows:任务计划程序,或者装APScheduler库,纯Python定时,更灵活。
我现在就放在公司的一台小Linux服务器上,每天自动跑,从来没掉链子。
跑着跑着遇到问题别慌,我把最常见的都列出来:
- 连接超时:设备SSH没开,或者防火墙挡了。检查一下
ip ssh version 2。 - 分页问题:Netmiko默认处理了,但华为有时候要加
net_connect.send_command('screen-length 0 temporary')。 - 华为VRP8:device_type用
huawei_vrp更稳。 - 权限不够:Cisco要加secret字段进enable模式。
我当初也被这些坑过,现在脚本里都加了try-except和重试机制,基本不会卡死。
一定要备注:工种+地点+学校/公司+昵称(如网络工程师+南京+苏宁+猪八戒),根据格式备注,可更快被通过且邀请进群
