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.pswp.cn/pingmian/81915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SHELL编程简介

1.脚本格式: 声明位于shell脚本的行首,通常形式如下: #!/bin/sh#!/bin/bash 其中#表示注释,!声明所使用的shell,后面为所使用shell的绝对路径。 2.常用函数 echo:shell输出语句,可不接参数…

Django 中的 ORM 基础语法

深入剖析 Django 中的 ORM 语法:从基础到实战进阶 在 Django 开发领域,ORM(对象关系映射)是开发者高效操作数据库的得力工具。它以简洁直观的 Python 代码,替代繁琐的 SQL 语句,极大提升了开发效率。本文将…

A10服务器使用vllm推理框架成功运行Qwen3大模型

1.下载Qwen3大模型: git clone https://www.modelscope.cn/Qwen/Qwen3-1.7B.git放在服务器的/mnt/workspace/Qwen3-1.7B目录下。 2.创建python虚拟环境: python3 -m venv venv1 source venv1/bin/activate3.安装vllm推理框架 pip install vllm 4.启动…

Disruptor—1.原理和使用简介

大纲 1.Disruptor简介 2.Disruptor和BlockingQueue的压测对比 3.Disruptor的编程模型 4.Disruptor的数据结构与生产消费模型 5.RingBuffer Disruptor Sequence相关类 6.Disruptor的WaitStrategy消费者等待策略 7.EventProcessor EventHandler等类 8.Disruptor的运行…

谷歌浏览器调试python pygui程序

谷歌浏览器地址:chrome://inspect/#devices 前端vue为8080, 配置如下 pychat 需要配置环境变量 PYTHONUNBUFFERED1;QTWEBENGINE_REMOTE_DEBUGGING9012

手写Tomcat(二)—Tomcat简化模型架构

一、 Tomcat架构 Tomcat的主要角色是 servlet容器,提供一个解释器,能够解析并执行JavaScript Object Notation (JON)脚本(后更改为Servlet),并将请求传送到指定的服务器(如JavaBean)。因此&…

Android 网络全栈攻略(五)—— 从 OkHttp 拦截器来看 HTTP 协议二

上一篇我们介绍了 OkHttp 的责任链以及第一个内置拦截器 —— 重试与重定向拦截器。本篇我们将剩余四个拦截器的解析做完。 1、桥接拦截器 BridgeInterceptor 作为请求准备和实际发送之间的桥梁,自动处理 HTTP 请求头等繁琐工作。比如设置请求内容长度&#xff0c…

JDBC-java操作数据库

1.基本结构: package com.atguigu.servlets;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class JDBCemo {public static void main(String[] args) throws Exception{String url "jdbc:mysql:///mysql&qu…

七彩喜适老化改造:让每个空间成为长者尊严的守护者

随着我国老龄化进程的加速,居家养老逐渐成为老年人首选的生活方式。 为了让老年人能够在熟悉的环境中安享晚年,适老化改造应运而生。 七彩喜作为居家养老服务的创新者,致力于通过科学设计和人性化改造,为老年人提供安全、舒适、…

【动态规划】5 从一次函数出发推导斜率优化dp

背景 基于例题《任务安排》逐步推导进行斜率优化。 引入 例题:P2365 任务安排 考虑动态规划。使用 d p i , j dp_{i,j} dpi,j​ 表示前 i i i 个任务分了 j j j 段的最小费用。 显然,有 d p i , j min ⁡ k 1 i − 1 ( d p i , j , d p k , j…

MySQL中实现大数据量的快速插入

一、SQL语句优化​ 1. ​批量插入代替单条插入​ ​单条插入会频繁触发事务提交和日志写入,效率极低。​批量插入通过合并多条数据为一条SQL语句,减少网络传输和SQL解析开销。 -- 低效写法:逐条插入 INSERT INTO table (col1, col2) VALUE…

C++23中std::span和std::basic_string_view可平凡复制提案解析

文章目录 一、引言二、相关概念解释2.1 平凡复制(Trivially Copyable)2.2 std::span2.3 std::basic_string_view 三、std::span和std::basic_string_view的应用场景3.1 std::span的应用场景3.2 std::basic_string_view的应用场景 四、P2251R1提案对std::…

广东省省考备考(第十八天5.23)—言语:语句填空题(听课后强化训练)

错题 解析 横线出现在文段中间,需结合上下文内容进行分析。文段开篇指出逃离北上广深的话题时而出现,一些人离开大城市回到小城市。随后通过转折词“但”引出横线内容,且结合横线后人才倾向于向更发达的地方流动的内容,横线处应体…

持续更新 ,GPT-4o 风格提示词案例大全!附使用方式

本文汇集了各类4o风格提示词的精选案例,从基础指令到复杂任务,从创意写作到专业领域,为您提供全方位的参考和灵感。我们将持续更新这份案例集,确保您始终能够获取最新、最有效的提示词技巧。 让我们一起探索如何通过精心设计的提…

创建型:建造者模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 工作流程 2.3 实现案例 2.4 变体:链式建造者(常见于多参数对象,无需指挥者) 3、优缺点分析 4、适用场景 1、核心思想 目的:将复杂对象的构建过程与其表示分离…

力扣-长度最小的子数组

1.题目描述 2.题目链接 LCR 008. 长度最小的子数组 - 力扣(LeetCode) 3.题目分析 这道题目我们使用的也是双指针。我们可以定义两个指针都指向数组第一个元素,然后使用right指针遍历原数组,计算left指针到right指针之间的所有元…

JAVA开发工具延长方案

亲测稳定的延长方案与避坑指南 真的搞不懂了,说点专业的术语竟然成了 QINQUAN。那就直接点,把这个方案带给需要的开发者。 延长工具直通车 保姆级教程 延长方案https://mp.weixin.qq.com/s/uajM2Y9Vz6TnolzcLur_bw还是让大家看看,发什么会被…

SpringAI开发SSE传输协议的MCP Server

SpringAI 访问地址:Spring AI ‌ Spring AI‌是一个面向人工智能工程的应用框架,由Spring团队推出,旨在将AI能力集成到Java应用中。Spring AI的核心是解决AI集成的根本挑战,即将企业数据和API与AI模型连接起来‌。 MCP…

JAVA动态生成类

在java的加载过程一般都是要预先定义java类,然后通过经过加载->连接->初始化三步。连接过程又可分为三步:验证->准备->解析。初始化的类是不允许修改。但是在日常的工作中有时候需要动态生成类,那第这种情况怎么办呢? 可以这么处理: 1、先定义一个空的类,仅…

深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践

深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践 引言 随着云计算和分布式系统的快速发展,微服务架构已成为现代软件开发的主流模式。Java作为企业级应用开发的核心语言,结合Spring Boot和Spring Cloud,为开发者提…