20人参与 • 2026-01-11 • 网络协议
snmp(simple network management protocol) 是用于网络设备管理的标准协议,支持对路由器、交换机、服务器等设备的监控和配置。核心功能包括:
| 角色 | 功能 | 对应 pysnmp 模块 |
|---|---|---|
| manager | 管理端(客户端),发起 snmp 请求(get/set) | hlapi(高级 api) |
| agent | 被管理设备端(服务器),响应请求并执行操作 | pysnmp.entity(agent 实现) |
| mib | 管理信息库,定义可管理的对象(oid)及其属性(类型、权限等) | pysnmp.smi(mib 解析) |
| oid | 对象标识符,唯一标识被管理的对象(如 1.3.6.1.2.1.1.1.0 表示系统描述) | objectidentity 类 |
1.3.6.1.2.1.1.1.0 对应 iso.org.dod.internet.mgmt.mib-2.system.sysdescr.0。pysnmp 中的操作:from pysnmp.hlapi import objectidentity
# 通过 oid 字符串创建
oid = objectidentity('1.3.6.1.2.1.1.1.0')
# 通过 mib 符号创建(需加载 mib)
oid = objectidentity('snmpv2-mib', 'sysdescr', 0)
pysnmp 中的加载:from pysnmp.smi import builder, view
# 初始化 mib 编译器
mib_builder = builder.mibbuilder()
mib_view = view.mibviewcontroller(mib_builder)
# 加载 mib 文件
mib_builder.loadmodule('snmpv2-mib')
| 版本 | 特点 | pysnmp 实现类 |
|---|---|---|
| v1 | 基于社区名(明文),无加密 | communitydata(community) |
| v2c | 改进错误处理,仍使用社区名 | communitydata(community) |
| v3 | 支持用户认证(usm)、加密(aes/des) | usmuserdata(user, authkey, privkey) |
snmp 消息由 header、security parameters(仅 v3)和 pdu 组成:
snmp message (ber encoded)
├── version
├── community/usmsecurityparameters (v3)
└── pdu (protocol data unit)
├── pdu type (get/set/getnext...)
├── request id
├── error status
├── error index
└── variable bindings (oid-value pairs)
from pysnmp.proto.api import v2c
# 构建 get 请求 pdu
pdu = v2c.getrequestpdu().addvarbinds(('1.3.6.1.2.1.1.1.0', v2c.octetstring('')))
message = v2c.message(apiversion=1, community='public', pdu=pdu)
# ber 编码为二进制
encoded_message = message.encode()
decoded_message, _ = v2c.message.decode(encoded_message) response_pdu = decoded_message['pdu']
| 层级 | 功能 | pysnmp 模块 |
|---|---|---|
| 应用层 | 用户接口(get/set/walk) | hlapi |
| 协议层 | 消息构建、编码/解码、安全处理(v3) | proto, entity |
| 传输层 | 网络通信(udp/tcp) | carrier |
| mib 层 | oid 解析与 mib 管理 | smi |
| snmp 概念 | pysnmp 类/方法 | 示例代码 |
|---|---|---|
| community (v2c) | communitydata | communitydata('public', mpmodel=1) |
| user (v3) | usmuserdata | usmuserdata('user1', authkey='auth123') |
| pdu | getrequestpdu, setrequestpdu | v2c.getrequestpdu() |
| transport | udptransporttarget, asyncore 事件循环 | udptransporttarget(('192.168.1.1', 161) |
from pysnmp.hlapi import getcmd, objecttype, objectidentity
error_indication, error_status, error_index, var_binds = next(
getcmd(snmpengine(),
communitydata('public'),
udptransporttarget(('192.168.1.1', 161)),
contextdata(),
objecttype(objectidentity('1.3.6.1.2.1.1.1.0')))
getrequestpdu,填充 oid。getresponsepdu。var_binds。getnext 请求,直到 oid 超出子树范围。pysnmp 中的实现:from pysnmp.hlapi import nextcmd
for (error_indication, error_status, error_index, var_binds) in nextcmd(
snmpengine(),
communitydata('public'),
udptransporttarget(('192.168.1.1', 161)),
contextdata(),
objecttype(objectidentity('1.3.6.1.2.1.1'))):
# 处理每个 oid-value 对
usmhmacmd5authprotocol、usmhmacshaauthprotocol)。usmdesprivprotocol、usmaescfb128protocol)。from pysnmp.hlapi import usmuserdata, getcmd
error_indication, error_status, error_index, var_binds = next(
getcmd(snmpengine(),
usmuserdata('user1',
authkey='authkey123',
privkey='privkey123',
authprotocol=usmhmacshaauthprotocol,
privprotocol=usmaescfb128protocol),
udptransporttarget(('192.168.1.1', 161)),
contextdata(),
objecttype(objectidentity('1.3.6.1.2.1.1.1.0')))
)
通过理解 snmp 协议的核心概念(oid、mib、pdu)和操作流程(get/set/walk),可以更深入地掌握 pysnmp 模块的设计逻辑:
pysnmp 的类和方法直接映射到 snmp 消息结构。到此这篇关于深入解析pysnmp的snmp协议的文章就介绍到这了,更多相关pysnmp snmp协议内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论