下面的代码使用pysnmp库在python中实现了snmpv3的getnext
from pysnmp.entity.rfc3413.oneliner import cmdgen
import sys
vallist = []
cmdGen = cmdgen.CommandGenerator()
def snmpv3_getnext(ip='',user='',hash_meth=None,hash_key=None,cry_meth=None,cry_key=None,oid='',num=1,type=None):
#usmHMACMD5AuthProtocol - MD5 hashing
#usmHMACSHAAuthProtocol - SHA hashing
#usmNoAuthProtocol - no authentication
#usmDESPrivProtocol - DES encryption
#usm3DESEDEPrivProtocol - triple-DES encryption
#usmAesCfb128Protocol - AES encryption, 128-bit
#usmAesCfb192Protocol - AES encryption, 192-bit
#usmAesCfb256Protocol - AES encryption, 256-bit
#usmNoPrivProtocol - no encryption
hashval = None
cryval = None
type=None
global vallist
vallist = [None]*num
#NoAuthNoPriv
if hash_meth==None and cry_meth== None:
hashval =cmdgen.usmNoAuthProtocol
cryval =cmdgen.usmNoPrivProtocol
model='NoAuthNoPriv'
#AuthNoPriv
elif hash_meth != None and cry_meth == None:
if hash_meth=='md5':
hashval=cmdgen.usmHMACMD5AuthProtocol
elif hash_meth=='sha':
hashval=cmdgen.usmHMACSHAAuthProtocol
else:
print('el algoritmo hash debe ser md5 o sha')
return
cryval = cmdgen.usmNoPrivProtocol
#AuthPriv
elif hash_meth != None and cry_meth != None:
if hash_meth=='md5':
hashval=cmdgen.usmHMACMD5AuthProtocol
elif hash_meth=='sha':
hashval=cmdgen.usmHMACSHAAuthProtocol
else:
print('el algoritmo hash debe ser md5 o sha')
return
if cry_meth == '3des':
cryval = cmdgen.usm3DESEDEPrivProtocol
elif cry_meth == 'des':
cryval = cmdgen.usmDESPrivProtocol
elif cry_meth == 'aes128':
cryval = cmdgen.usmAesCfb128Protocol
elif cry_meth == 'aes192':
cryval = cmdgen.usmAesCfb192Protocol
elif cry_meth == 'aes256':
cryval = cmdgen.usmAesCfb256Protocol
else:
print('El algoritmo de cifrado debe ser: 3des, des, aes128, aes192 o aes256 ')
return
# Si no se cumple con las especificaciones
else:
print(': NoAuthNoPriv, AuthNoPriv, AuthPriv')
return
errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.nextCmd(
cmdgen.UsmUserData(user, hash_key, cry_key,
authProtocol=hashval,
privProtocol=cryval),
cmdgen.UdpTransportTarget((ip, 161)),
oid,
lexicographicMode=True, maxRows=num, ignoreMonIncreasingOid=True
)
if errorIndication:
print(errorIndication)
else:
if errorStatus:
print('%s at %s' % (
errorStatus.prettyPrint(),
errorIndex and varBindTable[-1][int(errorIndex)-1] or '?'
)
)
else:
vallisttmp = []
for varBindTableRow in varBindTable:
for name, val in varBindTableRow:
print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
vallisttmp.append(val)
for i in range(num):
vallist[i] = vallisttmp[i]
if __name__ == '__main__':
try:
ip = sys.argv[1]
user = sys.argv[2]
hm = sys.argv[3]
hk = sys.argv[4]
cm = sys.argv[5]
ck = sys.argv[6]
oid = sys.argv[7]
num = int(sys.argv[8])
snmpv3_getnext(ip,user,hm,hk,cm,ck,oid,num)
except:
print('La Configuración de parametros debe ser la siguiente')
print('python3 get_next.py direccionip nombreusuario algoritmoautenticacion claveautenticacion algoritmocifrado clave cifrado OID numerodeOID')
print('El algoritmo de autenticacion es compatible con MD5 y SHA')
print('Compatible con algoritmos de cifrado 3des, des, aes128, aes192, aes256')
print('Ejemplo')
print('python3 mygetnext.py 192.168.1.1 user1 sha Cisc0123 des Cisc0123 1.3.6.1.2.1.2.2.1.10.1 10')
一切正常,但我的问题是,当我想发送getnext,但它只是一个用户级别的NoAuthNoPriv或AuthNoPriv时,它不起作用,只有当所有字段都完成时,它才起作用,也就是说,对于AuthPriv用户,我想知道你是否可以帮助我纠正哪些部分