使用pysnmp设置OID时报"No Such Object currently exists at this OID"求助
嘿,我之前用pysnmp的时候也碰到过这个坑!能正常读取OID却没法写入,还报这个错误,其实大概率是几个细节没处理好,咱们来一个个排查:
社区字符串权限不够:你读取用的是
public,但绝大多数设备默认public只有只读权限,写操作需要用专门的写权限社区字符串(比如常见的private)。先试试把设置OID时的CommunityData('public')改成CommunityData('private'),同时要确保目标设备上已经配置了允许这个社区字符串的写操作权限。OID不完整或格式不对:你代码里的OID是
1.3.6.1.2.1.1....,这明显是截断了的。SNMP的标量节点(就是那些单个值的OID)通常需要加上实例后缀.0才能正确定位,比如系统描述的完整OID是1.3.6.1.2.1.1.1.0,少了最后的.0就会触发“对象不存在”的错误。目标OID本身是只读的:不是所有能读取的OID都支持写入,有些节点在MIB里就是只读属性。你可以查一下目标设备的官方MIB文档,确认你要设置的那个OID对应的节点是否标注了可写(比如
WRITE或者READ-WRITE权限)。设置值的类型不匹配:用
setCmd的时候,必须保证传入的值和OID要求的数据类型一致。比如读取到的是字符串,设置的时候也得传同类型的字符串;如果是整数,就不能传字符串,类型不匹配也可能导致系统找不到对应的可写对象。
给你一个完整的示例脚本,你可以参考调整:
from pysnmp.hlapi import * hostIP = "你的设备IP地址" target_oid = "1.3.6.1.2.1.1.1.0" # 替换成你要操作的完整OID # 先读取OID验证 print("读取OID值:") errorIndication, errorStatus, errorIndex, varBinds = next( getCmd( SnmpEngine(), CommunityData('public'), UdpTransportTarget((hostIP, 161)), ContextData(), ObjectType(ObjectIdentity(target_oid)) ) ) if not errorIndication and errorStatus == 0: for varBind in varBinds: print(f"{varBind[0]} = {varBind[1]}") # 尝试设置OID(这里以设置字符串为例,根据你的OID类型调整值) print("\n尝试设置OID值:") errorIndication, errorStatus, errorIndex, varBinds = next( setCmd( SnmpEngine(), CommunityData('private'), # 使用有写权限的社区字符串 UdpTransportTarget((hostIP, 161)), ContextData(), ObjectType(ObjectIdentity(target_oid), "更新后的设备描述信息") ) ) if errorIndication: print(f"错误提示:{errorIndication}") elif errorStatus: print(f"{errorStatus.prettyPrint()} 位置:{errorIndex and varBinds[int(errorIndex)-1][0] or '未知'}") else: for varBind in varBinds: print(f"成功将 {varBind[0]} 设置为 {varBind[1]}") else: print(f"读取失败:{errorIndication or errorStatus.prettyPrint()}")
另外还要注意,目标设备的SNMP服务必须允许你的脚本所在IP访问,并且开启了写权限的配置项,有些设备会限制特定IP的SNMP操作权限。
内容的提问来源于stack exchange,提问作者Gero

