我可以从shell发送一个snmptrap(net-snmp-utils)命令,等效于-
snmptrap -v2c -c public myhostname.com '' .1.3.6.1.4.1.1234.7.0.1 .1.3.6.1.4.1.1234.7.1 s desktop 1.3.6.1.4.1.1234.7.2 s "TESTING" .1.3.6.1.4.1.1234.7.3 s CODE
我正在尝试通过python3做同样的事情。从脚本发送的陷阱消息由服务器/代理/管理器接收和处理。但是,来自python的代码(粘贴在下面的代码和输出)无法成功到达服务器。
到目前为止,我一直在使用pysnmp
from pysnmp import debug
debug.setLogger(debug.Debug('msgproc'))
from pysnmp.hlapi.asyncore import *
next(sendNotification(
SnmpEngine(),
CommunityData('public', mpModel=1),
UdpTransportTarget(('myhostname.com', 162)),
ContextData(),
'trap',
NotificationType(
ObjectIdentity('1.3.6.1.6.3.1.1.5.2')
).addVarBinds(
( '1.3.6.1.6.3.1.1.4.3.0', '.1.3.6.1.4.1.1234.7.0.1'),
('.1.3.6.1.4.1.1234.7.1', OctetString('desktop')),
('1.3.6.1.4.1.1234.7.2', OctetString('TESTING')),
('.1.3.6.1.4.1.1234.7.3', OctetString('CODE'))
)
))
输出为
2019-05-03 12:16:02,881 pysnmp:StatusInformation:{'errorIndication':AccessAllowed()} 2019-05-03 12:16:02,884 pysnmp:StatusInformation:{'errorIndication':AccessAllowed()} 2019-05-03 12:16:02,886 pysnmp:StatusInformation:{'errorIndication':AccessAllowed()} 2019-05-03 12:16:02,891 pysnmp:StatusInformation:{'errorIndication':AccessAllowed()} 2019-05-03 12:16:02,899 pysnmp:prepareOutgoingMessage:使用contextEngineId subtypeSpec,>编码iso-885 9-1有效载荷[0x80004fb805c3c8cf48]> contextName b'' 2019-05-03 12:16:02,904 pysnmp:generateRequestMsg:消息:
version=1
community=public
data=PDUs:
snmpV2-trap=SNMPv2TrapPDU:
request-id=10163951
error-status=noError
error-index=0
variable-bindings=VarBindList:
VarBind:
name=1.3.6.1.2.1.1.3.0
=_BindValue:
value=ObjectSyntax:
application-wide=ApplicationSyntax:
timeticks-value=0
VarBind:
name=1.3.6.1.6.3.1.1.4.1.0
=_BindValue:
value=ObjectSyntax:
simple=SimpleSyntax:
objectID-value=1.3.6.1.6.3.1.1.5.2
VarBind:
name=1.3.6.1.6.3.1.1.4.3.0
=_BindValue:
value=ObjectSyntax:
simple=SimpleSyntax:
objectID-value=1.3.6.1.4.1.1234.7.0.1
VarBind:
name=1.3.6.1.4.1.1234.7.1
=_BindValue:
value=ObjectSyntax:
simple=SimpleSyntax:
string-value=desktop
VarBind:
name=1.3.6.1.4.1.1234.7.2
=_BindValue:
value=ObjectSyntax:
simple=SimpleSyntax:
string-value=TESTING
VarBind:
name=1.3.6.1.4.1.1234.7.3
=_BindValue:
value=ObjectSyntax:
simple=SimpleSyntax:
string-value=CODE
在调试器上添加“ io”时,我最终得到了这个消息-是标准消息,还是意味着该消息已排队并且没有离开?
2019-05-06 04:55:42,914 pysnmp:sendMessage:传出消息已排队(164个八位字节) 00000:30 81 A1 02 01 01 04 06 70 75 62 6C 69 63 A7 81
答案 0 :(得分:0)
我不是pysnmp的专家,但是问题似乎来自snmp设置。您是否安排了代理?请检查http://www.net-snmp.org/docs/man/snmpd.conf.html以获得版本,rwusers,组等设置。 如果您需要替代方法,可以检查: https://github.com/pief/python-netsnmpagent 和 https://github.com/hosthvo/pyagentx
netsnmpagent无法发送陷阱,但您可以自己添加该规范。
我建议pyagentx。使用主代理有点困难,但是您可以创建您的agentx并将其扩展。但是不要忘记通过snmpd.conf进行设置。
答案 1 :(得分:0)
由于尚未启动主循环,因此尚未发送您的消息。
您可能应该导入pysnmp.hlapi
,而不是pysnmp.hlapi.asyncore
,因为前者最终默认为pysnmp.hlapi.asyncore.sync
,后者仅在内部对一个查询运行主循环。
pysnmp.hlapi.asyncore
模块是异步的。这意味着除了提交消息外,您还需要运行主循环(snmpEngine.transportDispatcher.runDispatcher()
)。您可以找到有关example异步使用的信息,但现在看来您只需要同步版本即可。