如何使用 PySNMP 为 HrSystemDate MIB 对象设置 DateAndTime

How to set DateAndTime for HrSystemDate MIB object using PySNMP

我无法在使用 pysnmp setCmd 时在标准 mib HrSystemDate 中设置 dateAndTime。我用八位字节串设置其他 mib 没有问题,唯一的问题是 date/time 设置,它也是一种八位字节串格式。 我不确定我错过了什么。 请告知如何通过pysnmp setCmd设置date/time。


我可以在 windows 命令中使用 snmpset 设置日期和时间,方法是使用此值格式 '2019-04-04,09:18:32.0,+13:0',

例如snmpset -v3 -l authPriv -u snmpAdmin -a SHA -A "password" -x AES -X "password" -n 终端 192.168.0.5 .1.3.6.1.2.1.25.1.2.0 = 2019-04- 04,09:18:32.0,+13:0

在推理中,我还可以将其设置为格式、日期和时间以及八位字节串 我还不能 post 一张照片,所以这是 link。 ireasoning


片段

code


def setSnmpV3string(ip, context='terminal', oid='.1.3.6.1.4.1.2509.8.29.2.15.1.2.1',value=''):
    errorIndication, errorStatus, errorIndex, varBinds = next(
        setCmd(SnmpEngine(),            
        UsmUserData('snmpAdmin', 'password', 'password',
                    authProtocol=usmHMACSHAAuthProtocol,
                    privProtocol=usmAesCfb128Protocol),
        UdpTransportTarget((ip, 161),),
        ContextData(contextName=context),
        ObjectType(ObjectIdentity(oid), OctetString(value) ))    
    )    
    values = '  =  '
    if errorIndication:
        print(errorIndication)
    elif errorStatus:
        print('%s at %s' % (errorStatus.prettyPrint(),
                        errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
    else:
        for varBind in varBinds:
            values = ' = '.join([x.prettyPrint() for x in varBind])
            print(values)
    return values.split(' = ')[1]

控制台输出

OctetString(value) 
<OctetString value object at 0x615ba90 tagSet <TagSet object at 0x502ca70 tags 0:0:4> subtypeSpec <ConstraintsIntersection object at 0x4fef090 consts <ValueSizeConstraint object at 0x4fe0b70 consts 0, 65535>> encoding iso-8859-1 payload [2019-04-04,10:27:41.0,+12:0]>

errorStatus
<Integer value object at 0x6106970 tagSet <TagSet object at 0x4ff59b0 tags 0:0:2> namedValues <NamedValues object 0x54d36b0 enums noError=0, tooBig=1, noSuchName=...Writable=17, inconsistentName=18> payload [commitFailed]>

我假设 pySnmp 需要与 iReasoning 相同的输入类型,但我 运行 不知道如何做。谢谢!

你必须让 pysnmp 以人类友好的形式获取时间戳并将其转换为八位字节序列。格式信息包含在 SNMPv2-TC::DateAndTime TEXTUAL-CONVENTION:

DISPLAY-HINT "2d-1d-1d,1d:1d:1d.1d,1a1d:1d"

要让 pysnmp 使用它,您可以在准备 SNMP 命令时传递 MIB 对象名称 (HOST-RESOURCES-MIB::hrSystemDate) 而不是 OID:

...
ObjectType(ObjectIdentity('HOST-RESOURCES-MIB', 'hrSystemDate'), value)

它的工作原理与 SNMP GET 类似,但相反。

仅针对 date/time 八位字节字符串的简单解决方案,我执行了以下操作: 我必须使用 strut pack 将日期时间字符串转换为字节。像这样,struct.pack('>HBBBBBBcBB', 'yyyy', 'mm','dd','H','M','S' ,0,b'+',time_offset,0) 将是 b'\x07\xe3\x04\x04\x0b\x02!\x07+\r\x00' 并且可以发送到上面的 snmpV3string 函数