第一次接触网络设备配置备份时,我像大多数人一样手动操作:登录设备、输入命令、保存文件。直到某天凌晨3点被叫起来处理故障,发现设备配置丢失却找不到最新备份文件时,才意识到自动化备份的重要性。
传统手动备份存在三个致命问题:容易遗漏(总有忘记备份的时候)、版本混乱(无法区分配置版本)、效率低下(管理上百台设备时简直是噩梦)。而使用Python脚本实现自动化备份,可以完美解决这些问题。
以华为AR路由器为例,日常需要备份的关键配置包括:
我曾经管理过一套分布在全国30个节点的网络,如果靠人工备份,完整跑一遍需要2天时间。改用Python自动化脚本后,所有设备配置在15分钟内完成备份,还能自动生成带时间戳的版本文件。
在开始写代码前,我们需要准备好实验环境。我用的是华为AR1220路由器(软件版本V200R003C00),管理IP设为192.168.30.100/24。你的环境可能不同,记得替换对应的IP地址和账号密码。
关键配置步骤:
bash复制[Huawei] telnet server enable
bash复制[huawei-aaa] local-user admin password cipher Admin@123
[huawei-aaa] local-user admin privilege level 15
[huawei-aaa] local-user admin service-type telnet
bash复制[Huawei] user-interface vty 0 4
[Huawei-ui-vty0-4] authentication-mode aaa
[Huawei-ui-vty0-4] protocol inbound telnet
注意:生产环境建议使用SSH替代Telnet,本文为演示使用更基础的Telnet协议。Python中对应的库是paramiko,用法逻辑与telnetlib类似。
推荐使用Python 3.6+版本,我实测过3.8和3.10都能稳定运行。只需要安装标准库即可,不需要额外依赖:
python复制import telnetlib
import time
如果你看到"telnetlib is deprecated"的警告别担心,这只是Python官方的提醒,在3.13版本前都还能正常使用。实际项目中可以考虑用第三方库(如pexpect)获得更强大的交互能力。
先看最核心的登录代码段,我加了详细注释:
python复制def telnet_backup(host, username, password, tftp_server):
try:
# 建立Telnet连接(超时设为10秒)
tn = telnetlib.Telnet(host, timeout=10)
# 读取到Username提示符(注意编码转换)
tn.read_until(b"Username:")
tn.write(username.encode('ascii') + b'\n')
# 处理密码输入
tn.read_until(b"Password:")
tn.write(password.encode('ascii') + b'\n')
# 等待登录完成(实测有些设备会有欢迎信息)
time.sleep(1)
# 发送save命令(\n相当于回车)
tn.write(b'save backup.cfg\n')
time.sleep(0.5)
tn.write(b'y\n') # 确认保存
time.sleep(0.5)
tn.write(b'y\n') # 确认覆盖
# 通过TFTP传输文件
tftp_cmd = f'tftp {tftp_server} put backup.cfg backup_{time.strftime("%Y%m%d%H%M")}.cfg\n'
tn.write(tftp_cmd.encode('ascii'))
time.sleep(3) # 等待传输完成
# 安全退出
tn.write(b'quit\n')
tn.close()
print(f"{host}配置备份成功!")
except Exception as e:
print(f"{host}备份失败:{str(e)}")
这段代码有几个易错点需要特别注意:
原始脚本缺少健壮的异常处理,我优化后的版本增加了这些保护:
python复制def safe_telnet_backup(host, username, password, tftp_server):
max_retry = 3
for attempt in range(max_retry):
try:
tn = telnetlib.Telnet(host, timeout=15)
# ...(同前文登录流程)
return True
except socket.timeout:
print(f"第{attempt+1}次连接超时,重试中...")
time.sleep(5)
except ConnectionRefusedError:
print("连接被拒绝,请检查Telnet服务是否开启")
break
except EOFError:
print("会话意外终止,可能是账号错误")
break
except Exception as e:
print(f"未知错误:{type(e).__name__}: {str(e)}")
break
finally:
if 'tn' in locals():
tn.close()
return False
实际部署时还建议添加:
管理真实网络时,我们需要处理设备列表。我通常用CSV文件管理设备信息:
python复制import csv
def batch_backup(device_file):
with open(device_file) as f:
reader = csv.DictReader(f)
for row in reader:
print(f"正在处理 {row['hostname']}({row['ip']})...")
telnet_backup(
host=row['ip'],
username=row['username'],
password=row['password'],
tftp_server='192.168.30.1'
)
CSV文件示例(devices.csv):
csv复制hostname,ip,username,password
核心交换机,192.168.1.1,admin,Admin@123
分支机构路由器,10.2.3.4,network,Net123!
虽然Linux下有crontab,但在Windows环境下可以这样设置定时任务:
bat复制@echo off
C:\Python38\python.exe D:\scripts\backup.py >> D:\logs\backup.log 2>&1
实测建议:将Python脚本编译为exe可避免环境依赖问题,推荐使用PyInstaller工具。
经过多个项目实践,我总结出这些实战经验:
python复制import git # 需要安装gitpython库
def version_control(config_file):
repo = git.Repo.init('D:/backups')
repo.index.add([config_file])
repo.index.commit(f"备份更新 {time.ctime()}")
这套方案在我负责的某银行网络改造项目中,成功将配置备份效率提升20倍,并在一次核心交换机故障时,用3分钟就完成了配置恢复。