尝试使用pysnmp传递真实的snmp。
如果我的主机是Xerox或HP打印机,则我的代码正在运行,并且可以访问变量varBinds[0][1]
中的oid值:
from pysnmp.entity.rfc3413.oneliner import cmdgen # snmp requests
cmdGen = cmdgen.CommandGenerator()
modeliod = ".1.3.6.1.2.1.25.3.2.1.3.1"
hostname = "192.168.1.100"
errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
cmdgen.CommunityData('public'),
cmdgen.UdpTransportTarget((hostname, 161)),
modeliod
)
但是,当我尝试访问佳能打印机的OID值时,则比errorIndication
= No SNMP response received before timeout
多。另一方面,当我将snmpwalk
与佳能的IP和相同的iod一起使用时,我可以得到一个值。
我的平台是Windows 10 x64。
如何解决“超时前未收到SNMP响应”问题?
Update1
排线:
from pysnmp import debug
debug.setLogger(debug.Debug('io', 'msgproc', 'secmod'))
调试输出很大,因此我将其粘贴到这里:https://pastebin.com/Lpyqm9NK
Update2
在SNMP get请求版本中似乎存在问题:当我将snmpwalk
请求中的版本更改为2c
时,我收到相同的错误:%Failed to get value of SNMP variable. Timeout.
第二个问题是
如何在我的代码中更改snmp版本?
答案 0 :(得分:0)
确保您:
如果一切正常,请尝试启用pysnmp调试,以查看结果,发现的内容(如果有的话)以及佳能打印机从哪个IP地址响应。如果它是通过与您查询的IP不同的IP进行响应的,则pysnmp将删除此类响应。
要启用pysnmp调试,请在脚本开头添加以下代码段:
from pysnmp import debug
debug.setLogger(debug.Debug('io', 'msgproc', 'secmod'))
更新:
默认情况下,使用SNMPv2c。要更改v1的SNMP版本,请将mpModel
设置为零:
...
CommunityData('public', mpModel=0),
...
答案 1 :(得分:0)
根据文档,这是一个工作环境: http://snmplabs.com/pysnmp/examples/hlapi/asyncore/sync/manager/cmdgen/snmp-versions.html
from pysnmp.hlapi import *
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData('public', mpModel=0),
UdpTransportTarget((hostname, 161)),
ContextData(),
ObjectType(ObjectIdentity(modeliod))) )