我想要的是发送snmp陷阱,就像我们的一个网络设备那样。陷阱包含DataTime的名称值,它类似于HEX String。
e.g. 1.3.6.1.4.1.193.82.1.8.1.4.0 : 07:de:07:10:0a:0c:1e:00:2b:08:00
当我使用snmptrap
的{{1}}命令发送陷阱时,我们的陷阱解码器可以成功地将十六进制字符串解析为net-snmp
格式(dateandtime
)它从我们的网络设备中得到了一个真正的陷阱。
我使用的命令是这样的:
YYYY-MM-HH hh:mm:ss
sudo /usr/local/net-snmp/bin/snmptrap -v 2c -c LI_OSS 10.184.74.66:162 "" 1.3.6.1.4.1.193.82.2.0.1 1.3.6.1.4.1.193.82.1.8.1.4.0 x "07de07100a0c1e002b0800"
表示字符串“x
”是某种十六进制格式。
当我尝试使用pysnmp发送完成相同的任务时,我们的陷阱解码器程序确实收到了陷阱但无法解析日期和时间。 这是我用来发送陷阱的代码,它是pysnmp的官方示例,here。
我只修改了主机及以下部分:
07de07100a0c1e002b0800
为了弄清楚差异,我使用WireShark捕获了使用ntfOrg.sendNotification(
snmpEngine,
# Notification targets
'my-notification',
# Trap OID (SNMPv2-MIB::coldStart)
(1,3,6,1,4,1,193,82,2,0,1),
# ( (oid, value), ... )
(
('1.3.6.1.4.1.193.82.1.8.1.4.0', rfc1902.OctetString('07de07100a0c1e002b0800'))
)
)
和snmptrap
发送陷阱的包,以下是差异。请注意,我没有使用相同的TRAP OID,但这种现象保持不变。
第一张照片是使用snmptrap发送陷阱,另一张是使用pysnmp。 Octet Strings与众不同。 有人知道为什么会这样吗?我怎样才能使用pysnmp在我的情况下发送陷阱呢?非常感谢提前!
答案 0 :(得分:3)
您将ASCII字符串作为OctetString()对象初始化程序传递。您应该向OctetString构造函数指出您的初始化程序将被解释为十六进制字符串。这可以使用hexValue关键字参数完成。考虑:
>>> str(univ.OctetString('07de07100a0c1e002b0800'))
'07de07100a0c1e002b0800'
>>> str(univ.OctetString(hexValue='07de07100a0c1e002b0800'))
'\x07\xde\x07\x10\n\x0c\x1e\x00+\x08\x00'