【问题标题】:How to set DateAndTime for HrSystemDate MIB object using PySNMP如何使用 PySNMP 为 HrSystemDate MIB 对象设置 DateAndTime
【发布时间】:2019-04-03 21:55:27
【问题描述】:

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


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

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

在推理中,我还可以在格式、日期和时间和八进制字符串上设置它 我还不能发图片,所以这里是链接。 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 相同的输入类型,但我不知道如何去做。谢谢!

【问题讨论】:

  • 在数据包级别,发送的是原始字节,而不是日期时间字符串。您必须根据 RFC 文档进行一些转换。
  • 谢谢我刚刚发现我必须使用 strut pack 将日期时间字符串转换为字节。像这样,struct.pack('&gt;HBBBBBBcBB', 'yyyy', 'mm','dd','H','M','S',0,b'+',time_offset,0) 将是 b'\x07\xe3\x04\x04\x0b\x02!\x07+\r\x00' 并且可以发送到上面的 snmpV3string 函数
  • 然后发布您自己的答案并接受它。
  • 好的。回答我自己的问题需要 48 小时。

标签: snmp pysnmp mib


【解决方案1】:

您必须让 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,它的工作方式类似,但相反。

【讨论】:

    【解决方案2】:

    对于日期/时间八位字节字符串的简单解决方案,我执行了以下操作: 我必须使用 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函数中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多