如何使用 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 函数
我无法在使用 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 函数