pysnmp:佳能打印机返回错误“超时前未收到 SNMP 响应”(Xerox 和 HP 都可以)

问题描述 投票:0回答:2

尝试使用 pysnmp 传输真正的 snmp。 如果我的主机是 Xerox 或 HP 打印机,我的代码可以正常工作,并且我可以访问变量中的 oid 值

varBinds[0][1]
:

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 响应”问题?

更新1

除线:

from pysnmp import debug
debug.setLogger(debug.Debug('io', 'msgproc', 'secmod'))

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

更新2

这似乎是 SNMP get 请求版本中的问题:当我将

snmpwalk
请求中的版本更改为
2c
时,我收到相同的错误:
%Failed to get value of SNMP variable. Timeout.

所以,第二个问题是

如何更改我的代码中的 snmp 版本?

python snmp pysnmp
2个回答
1
投票

根据文档,这是一个解决方法:

from pysnmp.hlapi import *
errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData('public', mpModel=0),
           UdpTransportTarget((hostname, 161)),
           ContextData(),
           ObjectType(ObjectIdentity(modeliod))) )

0
投票

确保您:

  • 为您的 Canon 打印机使用正确的 IP、SNMP 社区名称和 SNMP 版本(1 与 2c)
  • 您的 Canon 打印机提供您尝试获取的 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 版本,请将

mpModel
设置为零:

...
CommunityData('public', mpModel=0),
...
© www.soinside.com 2019 - 2024. All rights reserved.