会用库的网工,一天干别人一周的活。
上一篇文章发了之后,后台收到不少留言:「我已经会用 Netmiko 连设备了,下一步学什么?」
问得好。
很多网工学 Python 的瓶颈不在语法,在「我不知道有哪些好用的库可以用」。每次遇到新需求,就想「是不是得从头写?」
不用。
网络自动化领域已经有一套成熟的工具链。这篇文章帮你一次性搞清楚。
如果你只能学一个库,就学 Netmiko。
它是 Paramiko 的上层封装,专门为网络设备做 SSH 连接优化的。开箱支持思科、华为、H3C、Juniper、Arista 等几十个厂商。
from netmiko import ConnectHandlerdev = {"device_type": "huawei_vrp","host": "10.1.1.1","username": "admin","password": "pass",}try:with ConnectHandler(**dev) as conn:print("===== 设备版本信息 =====")print(conn.send_command("display version"))except Exception as e:print("连接失败:", e)
Netmiko 帮你搞定了厂商之间的差异——思科的配置模式是 enable,华为是 system-view,这些它都自动处理。
适用场景:日常登录设备执行命令、配置备份、批量巡检。
Netmiko 的局限是:你发出的命令是厂商相关的。
思科 show ip interface brief,华为 display ip interface brief,H3C 又是另一种。你想写一个跨厂商的接口状态巡检脚本,就得写一堆 if-else。
NAPALM 解决了这个问题。
from napalm import get_network_driverdriver = get_network_driver("ios")# 设备信息device_ip = "10.1.1.1"username = "admin"password = "pass"try:# 连接设备with driver(device_ip, username, password, timeout=30) as dev:print("=== 连接成功,开始获取信息 ===")# 设备基本信息(主机名、型号、版本)facts = dev.get_facts()print("主机名:", facts["hostname"])print("型号:", facts["model"])print("版本:", facts["os_version"])interfaces = dev.get_interfaces()print("\n接口数量:", len(interfaces))dev.discard_config()except Exception as e:print("=== 连接/执行失败 ===")print("失败原因:", str(e))
你告诉它设备驱动类型,它返回统一格式的数据。换厂商不用改代码逻辑。
另一个杀手功能是 compare_config():它能自动比对当前配置和你要下发的配置,只告诉你差异部分——变更窗口里能省大把时间。
适用场景:多厂商环境、配置比对、BGP/OSPF 状态监控。
网工每天看这种东西:
Interface IP-Address OK? Method StatusGigabitEthernet0/0 10.1.1.1 YES NVRAM upGigabitEthernet0/1 unassigned YES NVRAM down
但如果你想在脚本里拿到「哪个接口是 down 的」,你得写正则去解析。
ntc-templates 说:不用了。
from netmiko import ConnectHandlerdevice = {"device_type": "cisco_ios","host": "10.1.1.1","username": "admin","password": "pass"}with ConnectHandler(**device) as conn:output = conn.send_command("show ip interface brief", use_textfsm=True)for intf in output:print(intf["intf"], intf["status"])
netmiko整合了textfsm和ntc-templates,use_textfsm=True 这个参数,背后就是 ntc-templates 在干活。它内置了上百个厂商命令的解析模板,输出自动变成 list of dict。
适用场景:任何需要结构化解析 CLI 输出的场景。
ntc-templates 覆盖了主流厂商的主流命令,但有些场景它管不到:
• 某个厂商的非标输出格式
• 工控设备、安全设备等非网络设备
这时用 TextFSM 自己写模板。
#文件 1:show_int.template (模板文件)Value INTF (\S+)Value IPADDR (\S+)Value STATUS (up|down)Value PROTO (up|down)Start^${INTF}\s+${IPADDR}\s+${STATUS}\s+${PROTO} -> Record
#Python代码import textfsm# 模拟设备输出output = """Vlan1 192.168.1.1 up upGigabit0/1 unassigned down down"""# 加载模板with open("show_int.template") as tmpl:parser = textfsm.TextFSM(tmpl)# 解析文本result = parser.ParseText(output)print(result)
写一次模板,永久复用。
适用场景:非标设备、特殊命令输出、工控/安全设备。
前面四个库底层都是 Paramiko。一般情况下你不需要直接用,但以下场景 Paramiko 无可替代:
• 跳板机:先 SSH 到堡垒机,再跳转到目标设备
• 交互式会话:设备 CLI 有分页或多级菜单
• 特殊认证:密钥 + 密码双因素、交互式 token
import paramikoimport time# 设备信息ip = "10.1.1.1"username = "admin"password = "pass"try:# 创建SSH客户端ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接设备(加超时,防止卡死)ssh.connect(hostname=ip,username=username,password=password,port=22,timeout=10)# 【关键】华为必须用交互式 shellshell = ssh.invoke_shell()time.sleep(1)# 发送命令shell.send("display version\n")time.sleep(2)# 读取输出output = shell.recv(65535).decode("utf-8")print(output)# 关闭连接ssh.close()except Exception as e:print(f"连接失败:{str(e)}")
适用场景:跳板机环境、复杂交互、特殊认证需求。
你的需求 | 用哪个 |
刚入门,想连设备 | Netmiko |
多厂商,想统一接口 | NAPALM |
想看结构化数据 | ntc-templates + Netmiko |
非标设备,需自定义解析 | TextFSM |
跳板机 / 特殊认证 | Paramiko |
大部分场景,Netmiko + ntc-templates 就够了。等你遇到多厂商环境再加 NAPALM。
· · ·
你平时最常用哪个库?有没有我没提到的宝藏工具?评论区分享给大家。
觉得有用?点个「在看」,转发给也在学自动化的同事。
后台回复「工具库」获取这 5 个库的速查卡片。