“在接收到SNMP超时之前,打印机没有收到SNMP响应”(PyXer没有收到SNMP响应)

2024-09-30 14:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试使用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
    )

但当我试图访问Canon printer的OID值时,errorIndication=No SNMP response received before timeout。另一方面,当我将snmpwalk与Canon的IP和相同的iod一起使用时,我可以接收到一个值。在

我的平台是Windows10x64。在

如何解决“超时前未收到SNMP响应”问题?

更新1

借记行:

^{pr2}$

调试输出很大,所以我把它粘贴在这里:https://pastebin.com/Lpyqm9NK

更新2

在snmpget请求的版本中似乎有一个问题:当我将snmpwalk请求中的版本更改为{}时,我收到了相同的错误:%Failed to get value of SNMP variable. Timeout.

所以,第二个问题是

如何在代码中更改snmp版本?


Tags: 代码版本hostnamesnmphpsnmpwalkpysnmpcanon
2条回答

根据文件,这里是一个工作区: 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))) )

确保您:

  • 为您的佳能打印机使用正确的IP、SNMP团体名称和SNMP版本(1 vs 2c)
  • 您的佳能打印机提供您要获取的OID(1.3.6.1.2.1.25.3.2.1.3.1
  • 您没有某种基于主机的防火墙来阻止来自脚本的流量,特别是%-)

如果一切正常,请尝试启用pysnmp调试,以查看输出、输入(如果有)以及佳能打印机响应的IP地址。如果它从与您查询的IP不同的IP进行响应,那么pysnmp将放弃此类响应。在

要启用pysnmp调试,请在脚本开头添加以下代码段:

from pysnmp import debug

debug.setLogger(debug.Debug('io', 'msgproc', 'secmod'))

更新:

默认情况下,使用SNMPv2c。要将v1的SNMP版本设置为0,请执行以下操作:

^{pr2}$

相关问题 更多 >