我正在编写一些Python使用Twisted和pysnmp进行SNMP扫描。该代码在扫描路由的网络时有效(是!),但是在扫描我的开发人员所在的子网时会不断地引发错误。
我已经通过多次测试确认,当扫描大小为/ 21(2048个地址)的路由网络时,不会发生任何错误。但是当扫描我的本地子网时,我得到了错误。本地子网是/ 23(512个地址),但是错误并不一致,因为如果我将扫描范围限制为本地网络的子集,我有时可以成功地将其扫描为/ 24(256)或/ 25(128),但并非总是如此。这些大小有时也会产生错误。
以下是相关代码:
from twisted.internet.defer import DeferredList
from twisted.internet.task import react
from pysnmp.hlapi.twisted import *
import ipaddress
def getsystem(reactor, snmpengine, hostname, varBinds):
d = getCmd(snmpengine,
CommunityData('communityname', mpModel=0),
UdpTransportTarget((hostname, 161)),
ContextData(),
varBinds)
d.addCallback(success, hostname).addErrback(failure, hostname)
return d
def getall(reactor, hostnames):
snmpengine = SnmpEngine()
test = reactor.getThreadPool
print(counter)
return DeferredList(
[
getsystem(reactor, snmpengine, hostname, ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
for hostname in hostnames
]
)
network = ipaddress.ip_network('10.10.16.0/21', strict=False)
hosts = []
for addr in network.hosts():
hosts.append(str(addr))
react(getall, [hosts])
我得到的最终错误是,如果有帮助,我可以提供整个引用。我意识到的是,尽管我需要能够捕捉到这些错误并进行处理,以确保我不会使网络或特定设备的SNMP堆栈过载,但我确实需要能够限制未接来电的数量。我将需要能够动态地做到这一点,所以我不希望任何事情变得如此“钝”,因为我宁愿能够计算未完成的请求,然后基于此限制。 >
“ pysnmp.carrier.error.CarrierError:扭曲的异常:[Errno 11]资源暂时不可用,原因:[Errno 11]资源暂时不可用”