编辑:抱歉耽搁了..。这仍然给我带来了麻烦-
Traceback (most recent call last):
File "snmp1.py", line 18, in <module>
print_snmp_event(varBindTableRow)
File "snmp1.py", line 7, in print_snmp_event
print '{1} = {3}'.format(*data)
IndexError: tuple index out of range这就是我尝试运行您最新的建议时得到的输出。
我有问题,正确地打印这个,我正在路由器上运行SNMP,我得到以下输出作为打印输出。我正在使用pysnmp将这些数据发送到路由器。
from pysnmp.entity.rfc3413.oneliner import cmdgen
cmdGen = cmdgen.CommandGenerator()
varBindTable = cmdGen.nextCmd(
cmdgen.CommunityData('STRING'),
cmdgen.UdpTransportTarget(('router', 161)),
'1.3.6.1.2.1.2.2.1.2','1.3.6.1.2.1.2.2.1.14'
)
for varBindTableRow in varBindTable:
print varBindTableRow我的输出是
[(ObjectName(1.3.6.1.2.1.2.2.1.2.222), OctetString('Gi4/2')), (ObjectName(1.3.6.1.2.1.2.2.1.15.215), Counter32(0))] 我想得到的是
Gi4/2 = 0我想我可以打印出来1,3,但不起作用。有人有什么建议吗?
对不起,这是输出:
print type(varBindTableRow[0])
TypeError: 'NoneType' object has no attribute '__getitem__'
print type(varBindTableRow[0][0])
TypeError: 'NoneType' object has no attribute '__getitem__'
print repr(varBindTableRow)
[[(ObjectName(1.3.6.1.2.1.2.2.1.2.1), OctetString('FastEthernet0/0')), (ObjectName(1.3.6.1.2.1.2.2.1.14.1), Counter32(0))],
print repr(varBindTableRow[0])
TypeError: 'NoneType' object has no attribute '__getitem__'
print repr(varBindTableRow[0][0])
TypeError: 'NoneType' object has no attribute '__getitem__'当我运行您给出的脚本时,我得到以下内容:
Traceback (most recent call last):
File "snmp_pull.py", line 18, in <module>
print_snmp_event(varBindTableRow)
File "snmp_pull.py", line 7, in print_snmp_event
print '{1} = {3}'.format(*data)
IndexError: tuple index out of range再次感谢你的帮助!
发布于 2014-09-22 05:41:35
我假设SNMP事件是您的程序试图解析的字符串。如果是这样,您可以使用regex模式提取所需的内容,如下所示。
#! /usr/bin/env python
import re
snmp_event = "[(ObjectName(1.3.6.1.2.1.2.2.1.2.222), OctetString('Gi4/2')), (ObjectName(1.3.6.1.2.1.2.2.1.15.215), Counter32(0))]"
print snmp_event
pat = re.compile(r'\w+\((.*?)\)')
data = pat.findall(snmp_event)
print '{1} = {3}'.format(*data)输出:
[(ObjectName(1.3.6.1.2.1.2.2.1.2.222), OctetString('Gi4/2')), (ObjectName(1.3.6.1.2.1.2.2.1.15.215), Counter32(0))]
'Gi4/2' = 0编辑
阿拉丁,我让你把这些信息粘贴到你原来的问题中,因为在评论中很难读到这样的信息,因为非常。
但我现在意识到我犯了个小错误:我应该让你这么做的:
print type(varBindTableRow[0])
print type(varBindTableRow[0][0])
print repr(varBindTableRow)
print repr(varBindTableRow[0])
print repr(varBindTableRow[0][0])它必须进入您的for循环。
真对不起。我从你的评论中得到了一点信息。所以试试这个。我不能保证它能工作,也不能测试它,因为我没有SNMP的东西。
import re
from pysnmp.entity.rfc3413.oneliner import cmdgen
def print_snmp_event(row):
pat = re.compile(r'\w+\((.*?)\)')
data = pat.findall(str(row))
print '{1} = {3}'.format(*data)
cmdGen = cmdgen.CommandGenerator()
varBindTable = cmdGen.nextCmd(
cmdgen.CommunityData('STRING'),
cmdgen.UdpTransportTarget(('router', 161)),
'1.3.6.1.2.1.2.2.1.2','1.3.6.1.2.1.2.2.1.14'
)
for varBindTableRow in varBindTable:
print_snmp_event(varBindTableRow)请让我知道它是否有效,如果它不起作用,请将结果粘贴到您的问题中(缩进以保留行,就像粘贴代码一样),将而不是粘贴到注释中。
https://stackoverflow.com/questions/25966152
复制相似问题