pysnmp模块中 GET、SET、WALK操作详细分步解析

在这里插入图片描述

1. SNMP GET 操作详解

1.1 核心代码结构
from pysnmp.hlapi import *# 定义参数
community = 'public'        # SNMPv2c 社区名
target_ip = '192.168.1.1'  # 目标设备 IP
oid = '1.3.6.1.2.1.1.1.0'  # 要查询的 OID# 发起 GET 请求
error_indication, error_status, error_index, var_binds = next(getCmd(SnmpEngine(),                    # SNMP 引擎(管理内部状态)CommunityData(community),        # 认证参数(社区名)UdpTransportTarget(              # 传输协议(UDP/IP)(target_ip, 161), timeout=2, retries=2),ContextData(),                   # SNMP 上下文(通常默认)ObjectType(ObjectIdentity(oid))  # 要查询的 OID)
)# 处理结果
if error_indication:print(f"通信错误: {error_indication}")
elif error_status:print(f"协议错误: {error_status} at index {error_index}")
else:for oid, value in var_binds:print(f"{oid} = {value}")
1.2 核心参数解析
参数/方法作用
SnmpEngine()管理 SNMP 引擎的全局状态(如消息 ID、缓存等),每个会话通常一个实例。
CommunityData(community)定义 SNMPv1/v2c 的社区名(类似密码)。
UdpTransportTarget()指定目标设备的 IP 和端口,支持超时(timeout)和重试(retries)。
ObjectIdentity(oid)将 OID 字符串(如 1.3.6.1.2.1.1.1.0)转换为内部对象。
getCmd()生成 SNMP GET 请求的生成器,需用 next() 触发执行。
1.3 流程说明
  1. 构建请求:通过 getCmd() 方法生成一个 SNMP GET 请求生成器。
  2. 发送请求:调用 next() 发送请求并等待响应。
  3. 解析响应:返回的 var_binds 是一个包含 (OID, 值) 的列表。
  4. 错误处理
    • error_indication: 网络或协议错误(如超时)。
    • error_status: SNMP 协议错误(如 noSuchName)。

2. SNMP WALK 操作详解

2.1 核心代码结构
from pysnmp.hlapi import *# 发起 WALK 请求(遍历子树)
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')),  # 遍历的起始 OIDlexicographicMode=False  # 是否按字典序遍历(默认 True))
)if error_indication:print(f"错误: {error_indication}")
else:for var_bind_row in var_bind_table:for oid, value in var_bind_row:print(f"{oid} = {value}")
2.2 核心参数解析
参数/方法作用
nextCmd()生成 SNMP GETNEXT 请求的生成器,用于遍历 MIB 树。
lexicographicMode=False控制遍历方式:False 表示仅在指定 OID 子树内遍历,避免无限循环。
2.3 流程说明
  1. 遍历机制nextCmd() 通过连续发送 GETNEXT 请求,逐个获取下一个 OID 的值。
  2. 终止条件:当返回的 OID 超出起始 OID 的子树范围时,自动停止。
  3. 结果处理var_bind_table 是一个二维列表,每行对应一次响应的多个变量绑定。

3. SNMP SET 操作详解

3.1 核心代码结构
from pysnmp.hlapi import *# 定义要设置的 OID 和值
oid = '1.3.6.1.2.1.1.5.0'  # 系统名称的 OID
new_value = OctetString('NewRouterName')  # 新值类型需与 OID 定义匹配# 发起 SET 请求
error_indication, error_status, error_index, var_binds = next(setCmd(SnmpEngine(),CommunityData('private', mpModel=1),  # 使用写权限的社区名UdpTransportTarget(('192.168.1.1', 161)),ContextData(),ObjectType(ObjectIdentity(oid), new_value))
)if error_indication:print(f"通信错误: {error_indication}")
elif error_status:print(f"SET 失败: {error_status} at index {error_index}")
else:print("SET 操作成功")
3.2 核心参数解析
参数/方法作用
setCmd()生成 SNMP SET 请求的生成器。
CommunityData('private', mpModel=1)mpModel=1 表示 SNMPv2c(默认是 SNMPv1)。
ObjectType(oid, value)指定要设置的 OID 和值,值的类型必须与 OID 定义匹配(如 OctetString)。
3.3 流程说明
  1. 权限验证:确保使用具有写权限的社区名(如 private)。
  2. 数据类型匹配:必须按照 MIB 定义的类型传递值(如 IntegerOctetString)。
  3. 错误处理:常见错误包括 noAccess(权限不足)或 wrongType(类型不匹配)。

4. 核心流程总结

4.1 通用流程
  1. 初始化引擎SnmpEngine() 管理 SNMP 协议栈。
  2. 配置认证
    • SNMPv2c: CommunityData()
    • SNMPv3: UsmUserData()(需配置用户、认证协议和加密协议)。
  3. 选择传输协议:通常为 UdpTransportTarget()
  4. 构建请求ObjectType(ObjectIdentity(oid)) 定义要操作的 OID。
  5. 发送请求:通过 getCmd()/nextCmd()/setCmd() 生成请求,用 next() 触发。
  6. 处理响应:检查错误并解析返回的 OID 值。
4.2 数据类型映射
SNMP 类型pysnmp 类型示例
OCTET STRINGOctetStringOctetString('Hello')
INTEGERIntegerInteger(42)
IP AddressIpAddressIpAddress('192.168.1.1')
OIDObjectIdentifierObjectIdentifier('1.3.6.1')

5. 常见问题与调试

5.1 错误排查
  • 超时或无响应
    • 检查目标设备的 SNMP 服务状态(snmpwalk -v 2c -c public 192.168.1.1)。
    • 确认防火墙允许 UDP 161 端口。
  • 权限不足
    • 确保使用正确的社区名(如 private 用于 SET 操作)。
    • SNMPv3 检查用户名、认证密钥和加密密钥。
  • OID 不存在
    • 使用 snmpwalk 验证 OID 是否有效。
    • 检查 MIB 文件是否正确加载。
5.2 调试技巧
  • 启用调试日志
    import logging
    logging.basicConfig(level=logging.DEBUG)
    
  • 逐步验证
    1. 先用 snmpget/snmpwalk 命令行工具测试。
    2. 逐步将成功命令的参数转换为 pysnmp 代码。

6. 高级应用场景

6.1 批量查询多个 OID
# 在 getCmd() 中传入多个 ObjectType
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')),  # sysDescrObjectType(ObjectIdentity('1.3.6.1.2.1.1.5.0'))  # sysName)
)
6.2 异步操作(非阻塞)
from pysnmp.hlapi.asyncio import *async def async_get():error_indication, error_status, error_index, var_binds = await getCmd(SnmpEngine(),CommunityData('public'),UdpTransportTarget(('192.168.1.1', 161)),ContextData(),ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0')))# 处理结果...# 在事件循环中运行
import asyncio
asyncio.run(async_get())

通过以上详细解析,你可以更清晰地理解 pysnmp 的核心操作流程。建议从简单 GET 请求开始,逐步扩展到 WALK 和 SET 操作,并结合实际设备进行测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86598.shtml

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

相关文章

接收rabbitmq消息

以下是一个使用纯Java&#xff08;非Spring Boot&#xff09;接收RabbitMQ消息的完整实现&#xff0c;包含Maven依赖和持续监听消息的循环&#xff1a; 1. 首先添加Maven依赖 (pom.xml) <dependencies><!-- RabbitMQ Java Client --><dependency><group…

SQL进阶之旅 Day 23:事务隔离级别与性能优化

【SQL进阶之旅 Day 23】事务隔离级别与性能优化 文章简述 在数据库系统中&#xff0c;事务是确保数据一致性和完整性的核心机制。随着业务复杂度的提升&#xff0c;如何合理设置事务隔离级别以平衡并发性能与数据一致性成为开发人员必须掌握的关键技能。本文深入解析事务隔离级…

六.原型模式

一.原型模式的定义 原型模式是一种创建型设计模式&#xff0c;通过复制现有对象&#xff08;原型&#xff09;生成新对象&#xff0c;避免重复初始化成本。需了解以下关键概念&#xff1a; ‌浅拷贝‌&#xff1a;复制基本类型字段&#xff0c;引用类型字段共享内存地址&#…

【笔记】LoRA 理论与实现|大模型轻量级微调

论文链接&#xff1a;LoRA: Low-Rank Adaptation of Large Language Models 官方实现&#xff1a;microsoft/LoRA 非官方实现&#xff1a;huggingface/peft、huggingface/diffusers 这篇文章要介绍的是一种大模型/扩散模型的微调方法&#xff0c;叫做低秩适应&#xff08;也就是…

Cilium动手实验室: 精通之旅---15.Isovalent Enterprise for Cilium: Network Policies

Cilium动手实验室: 精通之旅---15.Isovalent Enterprise for Cilium: Network Policies 1. 环境信息2. 测试环境部署3. 默认规则3.1 测试默认规则3.2 小测验 4. 网络策略可视化4.1 通过可视化创建策略4.2 小测试 5. 测试策略5.1 应用策略5.2 流量观测5.3 Hubble观测5.4 小测试 …

opencv RGB图像转灰度图

这段代码的作用是将一个 3通道的 RGB 图像&#xff08;CV_8UC3&#xff09;转换为灰度图像&#xff08;CV_8UC1&#xff09;&#xff0c;并使用 OpenCV 的 parallel_for_ 对图像处理进行并行加速。 &#x1f50d; 一、函数功能总结 if (CV_8UC3 img.type()) {// 创建灰度图 d…

React Hooks 的原理、常用函数及用途详解

1. ​​Hooks 是什么&#xff1f;​​ Hooks 是 React 16.8 引入的函数式组件特性&#xff0c;允许在不编写 class 的情况下使用 state 和其他 React 特性&#xff08;如生命周期、副作用等&#xff09;。​​本质是一类特殊函数​​&#xff0c;它们挂载到 React 的调度系统中…

学习路之PHP--webman协程学习

学习路之PHP--webman协程学习 一、准备二、配置三、启动四、使用 协程是一种比线程更轻量级的用户级并发机制&#xff0c;能够在进程中实现多任务调度。它通过手动控制挂起和恢复来实现协程间的切换&#xff0c;避免了进程上下文切换的开销 一、准备 PHP > 8.1 Workerman &g…

linux libusb使用libusb_claim_interface失败(-6,Resource busy)解决方案

linux libusb使用libusb_claim_interface失败&#xff08;-6&#xff0c;Resource busy&#xff09;解决方案 ✅ 问题原因&#x1f6e0;️ 解决方案&#x1f538; 方法一&#xff1a;分离内核驱动 libusb_detach_kernel_driver()&#x1f538; 方法二&#xff1a;使用 usb-devi…

使用mpu6500/6050, PID,互补滤波实现一个简单的飞行自稳控制系统

首先&#xff0c;参考ai给出的客机飞机的比较平稳的最大仰府&#xff0c;偏转&#xff0c;和防滚角度&#xff0c;如下&#xff1a; 客机的最大平稳仰俯&#xff08;Pitch&#xff09;、偏转&#xff08;Yaw&#xff09;和防滚&#xff08;Roll&#xff09;角度&#xff0c;通…

深度解析AD7685ARMZRL7:16位精密ADC在低功耗系统中的设计价值

产品概述 AD7685ARMZRL7是16位逐次逼近型&#xff08;SAR&#xff09;ADC&#xff0c;采用MSOP-10紧凑封装。其核心架构基于电荷再分配技术&#xff0c;支持2.3V至5.5V单电源供电&#xff0c;集成低噪声采样保持电路与内部转换时钟。器件采用伪差分输入结构&#xff08;IN/-&a…

EXCEL 实现“点击跳转到指定 Sheet”的方法

&#x1f4cc; WPS 表格技巧&#xff1a;如何实现点击单元格跳转到指定 Sheet 在使用 WPS 表格&#xff08;或 Excel&#xff09;时&#xff0c;我们经常会希望通过点击一个单元格&#xff0c;直接跳转到工作簿中的另一个工作表&#xff08;Sheet&#xff09;。这在制作目录页…

Python格式化:让数据输出更优雅

Python格式化&#xff1a;让数据输出更优雅 Python的格式化功能能让数据输出瞬间变得优雅又规范。不管是对齐文本、控制数字精度&#xff0c;还是动态填充内容&#xff0c;它都能轻松搞定。 一、基础格式化&#xff1a;从简单拼接开始 1. 百分号&#xff08;%&#xff09;格式…

2025年渗透测试面试题总结-小鹏[实习]安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 小鹏[实习]安全工程师 1. 自我介绍 2. 有没有挖过src&#xff1f; 3. 平时web渗透怎么学的&#xff0c;有…

VSCode科技风主题设计详细指南

1. 科技风设计的核心特点 科技风设计是一种强调未来感、现代感和高科技感的设计风格,在VSCode主题设计中,可以通过以下几个核心特点来体现: 1.1 色彩特点 冷色调为主:蓝色、紫色、青色等冷色调是科技风设计的主要色彩高对比度:深色背景配合明亮的霓虹色,形成强烈的视觉…

android知识总结

Activity启动模式 standard (标准模式) 每次启动该 Activity&#xff08;例如&#xff0c;通过 startActivity()&#xff09;&#xff0c;系统总会创建一个新的实例&#xff0c;并将其放入调用者&#xff08;启动它的那个 Activity&#xff09;所在的任务栈中。 singleTop (栈…

第3章 MySQL数据类型

MySQL数据类型 1、数字数据类型1.1 整数类型1.2 定点类型1.3 浮点类型1.4位值类型1.5 超出范围和溢出处理1.5.1 超出范围处理1.5.2 溢出处理 2、日期和时间数据类型3、字符串数据类型3.1 char和varchar类型3.2 binary和varbinary类型3.3 blob 和 text类型3.4 enum类型3.4.1 创建…

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…

mysql为什么一个表中不能同时存在两个字段自增

背景。设置sort自增。会引发错误 通常自增字段都是用于表示数据的唯一性。数据库限制。需要自定义排序字段大小。

牛客round95D

原题链接&#xff1a;D-小红的区间修改&#xff08;一&#xff09;_牛客周赛 Round 95 题目背景&#xff1a; 初始拥有一个长度10^100元素全为0的数组&#xff0c;进行q查询&#xff0c;每次查询如果区间内的元素都为0就将区间变为首项为 1、公差为 1 的等差数列&#xff1b;否…