python 实现的 snmptrap 接收器

本文介绍如何使用Python实现一个定制化的SNMP trap接收器,修复常见问题并提取所需数据。通过AsynsockDispatcher和pysnmp库,作者分享了关键代码段和变量绑定解析方法,适用于监控和网络管理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 python 实现的 snmptrap 接收器
因为网上找到的代码总有一些问题,也取不到需要的数据,所以对代码进行了修改

from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher
from pysnmp.carrier.asynsock.dgram import udp, udp6
from pyasn1.codec.ber import decoder
from pysnmp.proto import api
from pysnmp.proto.rfc1905 import VarBind
import re

def pick(varbind):
    pattern="name=(.*)[\s\S]*value=(.*)"
    regx=re.compile(pattern)
    matchs=regx.findall(varbind)
    if matchs:
        return matchs[0][0],matchs[0][1]
    else:
        return False

def cbFun(transportDispatcher, transportDomain, transportAddress, wholeMsg):
    while wholeMsg:
        msgVer = int(api.decodeMessageVersion(wholeMsg))
        if msgVer in api.protoModules:
            pMod = api.protoModules[msgVer]
        else:
            print('Unsupported SNMP version %s' % msgVer)
            return
        reqMsg, wholeMsg = decoder.decode(wholeMsg, asn1Spec=pMod.Message(),)
        # print("reqmsg:", reqMsg)
        # print("wholemsg:",wholeMsg)
        print('Notification message from %s:%s: ' % (transportDomain, transportAddress))
        reqPDU = pMod.apiMessage.getPDU(reqMsg)
        # print("pdu:",reqPDU)
        varBinds = pMod.apiPDU.getVarBindList(reqPDU)
        # print("varbinds:",varBinds)
        for row in varBinds:
            row: VarBind
            row=row.prettyPrint()
            k,v=pick(row)
            print("%s:%s" % (k,v))
    return wholeMsg

if __name__ == '__main__':
    transportDispatcher = AsynsockDispatcher()
    transportDispatcher.registerRecvCbFun(cbFun)
    # UDP/IPv4
    transportDispatcher.registerTransport(
        udp.domainName, udp.UdpSocketTransport().openServerMode(('0.0.0.0', 162))
    )
    # UDP/IPv6
    transportDispatcher.registerTransport(
        udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 162))
    )
    transportDispatcher.jobStarted(1)
    try:
        transportDispatcher.runDispatcher()
    except:
        transportDispatcher.closeDispatcher()
        raise

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值