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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86598.shtml
英文地址,請注明出處:http://en.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;否…