You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改pysnmp sendNotification中sysUpTimeInstance的默认0值

问题

我有一批会发送SNMP Trap告警的设备,现在需要模拟这些设备做测试,要求测试工具输出的Trap和真实设备完全一致,且各项值可手动控制。我用pysnmp的sendNotification写了Python脚本,整体运行正常,但DISMAN-EVENT-MIB::sysUpTimeInstance总是被sendNotification自动设为0发送出去。我试过在addVarBinds里加这个对象的自定义值,但只会新增一个同名对象,原来那个值为0的sysUpTimeInstance还是会存在。请问怎么修改这个自动生成的sysUpTimeInstance的值?

使用的版本信息:

  • pysnmp 4.4.12
  • pysnmp-pyasn1 1.1.3
  • pysnmp-pysmi 1.1.10
  • pysnmplib 5.0.21

脚本代码:

from pysnmp.hlapi import *

iterator7 = sendNotification(
    SnmpEngine(),
    CommunityData('public', mpModel=1),
    UdpTransportTarget(('localhost', 162)),
    ContextData(),
    'trap',
     NotificationType(ObjectIdentity('NET-SNMP-EXAMPLES-MIB', 'netSnmpExampleNotification')).addVarBinds(ObjectType(ObjectIdentity('NET-SNMP-EXAMPLES-MIB','netSnmpExampleHeartbeatRate'), 1))
)

errorIndication, errorStatus, errorIndex, varBinds = next(iterator7)

if errorIndication:
    print(errorIndication)

运行脚本后,通过snmptrapd接收到的内容:

DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (0) 0:00:00.00    SNMPv2-MIB::snmpTrapOID.0 = OID: NET-SNMP-EXAMPLES-MIB::netSnmpExampleNotification  NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatRate = INTEGER: 1
解决方法

要修改自动生成的sysUpTimeInstance值,需要通过pysnmp的MIB变量覆盖机制,在NotificationType初始化时直接指定自定义的sysUpTimeInstance值,而非用addVarBinds追加。具体操作如下:

  1. 在NotificationType的构造参数中传入包含sysUpTimeInstance的变量绑定列表,将自定义值放在最前面(符合SNMP Trap的标准格式要求)。
  2. 自定义值的单位为百分之一秒,比如设置为360000代表设备已运行1小时。

修改后的脚本示例:

from pysnmp.hlapi import *

# 自定义sysUpTime值,单位:百分之一秒
custom_sys_up_time = 360000

iterator7 = sendNotification(
    SnmpEngine(),
    CommunityData('public', mpModel=1),
    UdpTransportTarget(('localhost', 162)),
    ContextData(),
    'trap',
    NotificationType(
        ObjectIdentity('NET-SNMP-EXAMPLES-MIB', 'netSnmpExampleNotification'),
        varBinds=[
            # 显式指定sysUpTimeInstance的自定义值,覆盖默认的0
            ObjectType(ObjectIdentity('DISMAN-EVENT-MIB', 'sysUpTimeInstance'), custom_sys_up_time),
            ObjectType(ObjectIdentity('NET-SNMP-EXAMPLES-MIB','netSnmpExampleHeartbeatRate'), 1)
        ]
    )
)

errorIndication, errorStatus, errorIndex, varBinds = next(iterator7)

if errorIndication:
    print(errorIndication)

原理说明

pysnmp的sendNotification默认会自动添加值为0的sysUpTimeInstance和snmpTrapOID.0到变量绑定列表。但如果在NotificationType的varBinds参数中显式指定了sysUpTimeInstance,pysnmp就会使用你提供的自定义值,不再生成默认的0值条目。

修改后,snmptrapd接收到的sysUpTimeInstance就会是你设置的目标值,不会再出现重复的0值对象。


内容的提问来源于stack exchange,提问作者Steen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:16:28