es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna manera de obtener información con SNMP sin utilizar OIDs?

Estoy empezando a lidiar con SNMP. Quiero obtener información de los dispositivos en mi red como la dirección IP, dirección MAC, nombre, etc. Quiero hacer un descubrimiento de red.
Tengo el código a continuación. No quiero usar números de OID para esa información. ¿Hay alguna forma de obtener la información sin OIDs?
Además, la salida de mi código está mal. Los caracteres no se muestran correctamente.

from pysnmp.hlapi import *
import datetime

class SNMP_QUERY():
    def __init__(self):
        pass

    def __del__(self):
        pass


def snmp_query(host, community, oid):
    errorIndication, errorStatus, errorIndex, varBinds = next(
        getCmd(SnmpEngine(),
               CommunityData(community),
               UdpTransportTarget((host, 161)),
               ContextData(),
               ObjectType(ObjectIdentity(oid)),
               lookupMib=False))

    if errorIndication:
        print(errorIndication)
    else:
        if errorStatus:
            print('%s at %s' % (
                errorStatus.prettyPrint(),
                errorIndex and varBinds[int(errorIndex) - 1] or '?'
            )
                  )
        else:
            for name, val in varBinds:
                return (str(val))


def main():
    # Dispositivo de red
    host = '127.0.0.1'
    community = 'public'

    #overviewModelName = '.1.3.6.1.2.1.1.1.0'
    name = '1.3.6.1.2.1.1.5.0'
    macAddres = '.1.3.6.1.2.1.2.2.1.6.12'
    io_address = '.1.3.6.1.2.1.4.21.1.1.192.168.1.27'

    result = {}
   # result['Model Name'] = snmp_query(host, community, overviewModelName)
    result['Name'] = snmp_query(host, community, name)
    result['Mac Address'] = snmp_query(host, community, macAddres)
    result['IP'] = snmp_query(host, community, io_address)

    print(result)

if __name__ == '__main__':
    main()

Salida:

{'Name': 'DESKTOP-ANIHIT4', 'Mac Address': 'ÜA©Hð&', 'IP': 'ÀØ\x01\x1b'}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener información de dispositivos en la red como la dirección IP, dirección MAC, nombre y mucho más, sin utilizar números OID, podemos utilizar las especificaciones MIB SNMP del vendedor/objetos MIB neutrales del vendedor. Estas especificaciones se presentan en forma de archivos MIB que asocian cadenas con números OID para cada objeto MIB. Podemos utilizar un software de exploración MIB o bases de datos en línea, como oid-info.com, para buscar estas especificaciones y los números de OID asociados.

    En el código compartido anteriormente, podemos modificar la función snmp_query() para aceptar un nombre de objeto MIB específico como cadena, en lugar del número OID. Luego, podemos utilizar la función getCmd() para recuperar el valor del objeto MIB, utilizando la función ObjectType() que recibe la ObjectIdentity() del objeto MIB.

    Por ejemplo, para obtener el nombre del dispositivo, podemos modificar el código de la siguiente manera:

    SYS_NAME = 'SNMPv2-MIB::sysName.0'
    
    def snmp_query(host, community, mib_object):
        errorIndication, errorStatus, errorIndex, varBinds = next(
            getCmd(SnmpEngine(),
                   CommunityData(community),
                   UdpTransportTarget((host, 161)),
                   ContextData(),
                   ObjectType(ObjectIdentity(mib_object)),
                   lookupMib=True))  # se establece en verdadero para cargar automáticamente los MIB
    
        if errorIndication:
            print(errorIndication)
        else:
            if errorStatus:
                print('%s en %s' % (
                    errorStatus.prettyPrint(),
                    errorIndex and varBinds[int(errorIndex) - 1] or '?'
                )
                      )
            else:
                for name, val in varBinds:
                    return (str(val))
    
    
    def main():
        # Dispositivo de red
        host = '127.0.0.1'
        community = 'public'
    
        result = {}
        result['Nombre'] = snmp_query(host, community, SYS_NAME)
    
        print(result)
    
    
    if __name__ == '__main__':
        main()
    
    

    Observa que utilizamos lookupMib=True para cargar automáticamente los MIB específicos del vendedor y resolver los valores de cadena a sus números OID.

    En cuanto a la salida incorrecta, parece que los valores devueltos tienen algunos caracteres no imprimibles. Podemos utilizar la función repr() para imprimir el valor exacto de la cadena, incluyendo los no imprimibles. Esto puede ayudar a identificar el problema con la salida.

    print(repr(result['Nombre']))
    

    ¡Espero que esto te sea de ayuda!

Comments are closed.