将snmptrap命令转换为python(pysnmp或替代方法)

时间:2019-05-04 21:38:21

标签: python pysnmp snmp-trap

我可以从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

2 个答案:

答案 0 :(得分:0)

我不是pysnmp的专家,但是问题似乎来自snmp设置。您是否安排了代理?请检查http://www.net-snmp.org/docs/man/snmpd.conf.html以获得版本,rwusers,组等设置。 如果您需要替代方法,可以检查: https://github.com/pief/python-netsnmpagenthttps://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异步使用的信息,但现在看来您只需要同步版本即可。