如何使用 PySNMP 指定 auth/priv 键而不是密码?

How to specify auth/priv keys instead of pass phrases with PySNMP?

我有以下成功的 net-snmp 命令:

snmpget -v3 -l authPriv -3k $auth_key -3K $priv_key -u $user udp6:$ip 1.3.6.1.2.1.1.1.0

我一直试图在 PySNMP 中复制它,但似乎密钥没有被接受。我感觉 UsmUserData class 的 authKeyprivKey 参数实际上是在设置 auth 和 priv 密码短语,类似于 net-snmp 的 -A 和 -X 标志。

我尝试使用 binascii 模块中的各种函数修改我的密钥,这些密钥是 32 个字符的十六进制字符串,但这感觉就像找错了树。我的代码已经适用于 SNMPv2,但是将 CommunityData 换成 UsmUserData 会产生问题。

from pysnmp.hlapi import *

IP = '::1/128'
OID = '1.3.6.1.2.1.1.1.0'
USER = 'my_user'
AUTH, PRIV = '', ''  # 32-character lowercase hex strings

error_indication, error_status, error_index, var_binds = next(
    getCmd(SnmpEngine(),
           UsmUserData(USER, authKey=AUTH, privKey=PRIV),
           Udp6TransportTarget((IP, 161)),
           ContextData(),
           ObjectType(ObjectIdentity(OID)))
)
print(error_indication)
print([x[1].prettyPrint() for x in var_binds])

输出:

Wrong SNMP PDU digest
[]

当我修改命令以使用 CommunityData 执行 SNMPv2 调用时,我得到与使用 net-snmp 相同的结果。我得到的实际输出是 "Wrong SNMP PDU digest" 和一个空的 var_binds如何让 PySNMP 模拟 -3k 和 -3K 标志?

-3k-3m 选项在当代的 pysnmp API 中不容易实现。

但是,pysnmp 的一切都依赖普通 MIB 对象,包括它自己的配置。这意味着如果 SNMP-USER-BASED-SM-MIB (or any other MIB) holding the keys you need - that object can be easily accessed and modified.

中有一个对象

如果你想实现这个想法,GitHub issue 可能是处理它的好地方...