当前位置: 首页 > news >正文

Pysnmp使用指南

在这里插入图片描述

1. 简介

pysnmp 是一个纯 Python 实现的 SNMP(Simple Network Management Protocol)库,支持 SNMPv1、SNMPv2c 和 SNMPv3 协议。用于:

  • 查询(GET)和修改(SET)网络设备的管理信息。
  • 遍历(WALK)设备的 MIB(Management Information Base)树。
  • 实现 SNMP Agent(服务器)或 Manager(客户端)。

2. 安装

pip install pysnmp pysnmp-mibs  # 安装核心库和 MIB 支持

3. 基本用法

3.1 SNMP GET 请求
from pysnmp.hlapi import *# 定义 SNMP 参数
community = 'public'  # 社区名(SNMPv1/v2c)
ip_address = '192.168.1.1'  # 目标设备 IP
port = 161  # 默认 SNMP 端口
oid = '1.3.6.1.2.1.1.1.0'  # OID(例如:系统描述)# 发起 GET 请求
error_indication, error_status, error_index, var_binds = next(getCmd(SnmpEngine(),CommunityData(community),UdpTransportTarget((ip_address, port), timeout=2, retries=2),ContextData(),ObjectType(ObjectIdentity(oid)))
)# 处理响应
if error_indication:print(f"Error: {error_indication}")
elif error_status:print(f"Error Status: {error_status}")
else:for var_bind in var_binds:print(f"{var_bind[0]} = {var_bind[1]}")

3.2 SNMP WALK 遍历
from pysnmp.hlapi import *error_indication, error_status, error_index, var_bind_table = next(nextCmd(SnmpEngine(),CommunityData('public'),UdpTransportTarget(('192.168.1.1', 161)),ContextData(),ObjectType(ObjectIdentity('1.3.6.1.2.1.1')),  # 遍历系统组lexicographicMode=False)  # 按字典顺序遍历
)if error_indication:print(f"Error: {error_indication}")
else:for var_bind_row in var_bind_table:for var_bind in var_bind_row:print(f"{var_bind[0]} = {var_bind[1]}")

3.3 SNMP SET 操作
from pysnmp.hlapi import *error_indication, error_status, error_index, var_binds = next(setCmd(SnmpEngine(),CommunityData('private', mpModel=1),  # 使用写权限的社区名UdpTransportTarget(('192.168.1.1', 161)),ContextData(),ObjectType(ObjectIdentity('1.3.6.1.2.1.1.5.0'), OctetString('NewDeviceName')))
)if error_indication:print(f"Error: {error_indication}")
elif error_status:print(f"SET Error: {error_status}")
else:print("SET 操作成功")

4. SNMPv3 配置

SNMPv3 支持认证和加密:

from pysnmp.hlapi import *user = 'user1'
auth_key = 'authkey123'
priv_key = 'privkey123'error_indication, error_status, error_index, var_binds = next(getCmd(SnmpEngine(),UsmUserData(user,authKey=auth_key,privKey=priv_key,authProtocol=usmHMACSHAAuthProtocol,  # 认证协议privProtocol=usmAesCfb128Protocol),    # 加密协议UdpTransportTarget(('192.168.1.1', 161)),ContextData(),ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0')))
)

5. MIB 管理

使用 MIB 名称代替原始 OID:

from pysnmp.hlapi import *
from pysnmp.smi import compiler# 加载 MIB 文件
compiler.addMibCompiler(compiler.DirMibSource('/path/to/mibs'))
ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0).resolveWithMib()# 查询
error_indication, error_status, error_index, var_binds = next(getCmd(SnmpEngine(),CommunityData('public'),UdpTransportTarget(('192.168.1.1', 161)),ContextData(),ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
)

6. 高级主题

6.1 异步操作

使用 AsyncCommandGenerator 实现异步请求:

from pysnmp.hlapi.asyncio import *async def snmp_get():snmp_engine = SnmpEngine()error_indication, error_status, error_index, var_binds = await getCmd(snmp_engine,CommunityData('public'),UdpTransportTarget(('192.168.1.1', 161)),ContextData(),ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0')))# 处理结果...import asyncio
asyncio.run(snmp_get())
6.2 SNMP Agent 实现

创建简单的 SNMP Agent:

from pysnmp.entity import engine, config
from pysnmp.entity.rfc3413 import cmdrsp, contextsnmp_engine = engine.SnmpEngine()
config.addV1System(snmp_engine, 'my-area', 'public')
config.addTransport(snmp_engine, udp.domainName, udp.UdpTransport().openServerMode(('0.0.0.0', 161)))context.SnmpContext(snmp_engine)
cmdrsp.GetCommandResponder(snmp_engine, context.SnmpContext(snmp_engine))snmp_engine.transportDispatcher.jobStarted(1)
try:snmp_engine.transportDispatcher.runDispatcher()
except KeyboardInterrupt:snmp_engine.transportDispatcher.closeDispatcher()

7. 常见问题

Q1: 超时或无响应
  • 检查目标设备的 SNMP 服务是否启用。
  • 检查防火墙是否允许 UDP 161 端口通信。
Q2: OID 不存在
  • 使用 snmpwalk 或 MIB 浏览器确认目标设备支持的 OID。
Q3: 权限不足
  • 确保使用正确的社区名(如 private 用于写操作)。
  • 对于 SNMPv3,检查用户认证和加密参数。
Q4: MIB 加载失败
  • 确认 MIB 文件路径正确,或手动下载 MIB 文件。

通过以上步骤,可以快速上手 pysnmp 进行基本的 SNMP 操作。更详细的文档请参考 pysnmp 官方文档。

http://www.xdnf.cn/news/602677.html

相关文章:

  • CentOS停止维护了,解决yum不能安装软件的问题
  • 网络通信与传输安全
  • echarts定制化柱状图——条纹柱状图
  • RK3588 Opencv-ffmpeg-rkmpp-rkrga编译与测试
  • 【JAVA】注解基础:元注解与自定义注解(30)
  • 【飞书知识问答】AI赋能企业,开启高效办公新模式
  • Google机器学习实践指南(学习速率篇)
  • (随记)商业落地实施RAG工程的核心步骤
  • 项目管理的流程与核心细节全解析
  • 如何使用 WebStorm 编写第一个 Node.js 项目
  • 《P3375 【模板】KMP》
  • 9大开源AI智能体概况
  • Python爬虫(34)Python爬虫高阶:动态页面处理与Playwright增强控制深度解析
  • c语言文件操作详解
  • 实验-设计一个应用系统(计算机组成原理)
  • Web攻防-SQL注入数据库类型用户权限架构分层符号干扰利用过程发现思路
  • Docker 与 Kubernetes 部署 RabbitMQ 集群(一)
  • 数据共享中的库表交换怎么做?
  • 【生成模型】【基础知识】CFG与CFG蒸馏
  • 深度解析:SQLynx 如何筑牢数据库安全防线​
  • 邻近标记技术(PL)在癌症研究中的应用
  • 动态规划中的 求“最长”、“最大收益”、“最多区间”、“最优策略” 双重 for + 状态转移
  • 视觉语言模型(Vision-Language Model, VLM)的简单介绍
  • 文章记单词 | 第105篇(六级)
  • Python、PyTorch、TensorFlow和飞桨(PaddlePaddle)的核心介绍及对比
  • Flutter遇到的问题
  • 安装 tensorflow-2.10.0 支持 gpu
  • 【Go-4】函数
  • Android Studio 开发环境兼容性检索(AGP / Gradle / Kotlin / JDK)
  • 音频AAC编码与RV1126的AENC模块的讲解