snmpwalk with PySNMP

11,791

Try passing the lexicographicMode keyword argument to the nextCmd(). For example:

for (errorIndication,
     errorStatus,
     errorIndex,
     varBinds) in nextCmd(SnmpEngine(), 
                          CommunityData('public'),
                          UdpTransportTarget((host, 161)),
                          ContextData(),                                                           
                          ObjectType(ObjectIdentity(oid)),
                          lexicographicMode=False):
    ...

That should have the effect of capping the SNMP walk by the initial OID you give it (assuming that unwanted OIDs you mention are those going out of the prefix).

Share:
11,791
Stéphane
Author by

Stéphane

Mostly self-taught computer scientist and free software enthusiast since 1999 I'm a versatile technician working in a production department. I like to resolve problems and find solutions for a given need.

Updated on August 19, 2022

Comments

  • Stéphane
    Stéphane almost 2 years

    I’d like to reproduce the comportment of the following SNMP command :

    snmpwalk -v2c -cpublic 192.168.0.10 1.3.6.1.2.1.25.2.3.1.3
    

    which gives me this output :

    iso.3.6.1.2.1.25.2.3.1.3.1 = STRING: "Physical memory"
    iso.3.6.1.2.1.25.2.3.1.3.3 = STRING: "Virtual memory"
    iso.3.6.1.2.1.25.2.3.1.3.6 = STRING: "Memory buffers"
    iso.3.6.1.2.1.25.2.3.1.3.7 = STRING: "Cached memory"
    iso.3.6.1.2.1.25.2.3.1.3.8 = STRING: "Shared memory"
    iso.3.6.1.2.1.25.2.3.1.3.10 = STRING: "Swap space"
    iso.3.6.1.2.1.25.2.3.1.3.31 = STRING: "/"
    iso.3.6.1.2.1.25.2.3.1.3.37 = STRING: "/run"
    iso.3.6.1.2.1.25.2.3.1.3.39 = STRING: "/dev/shm"
    iso.3.6.1.2.1.25.2.3.1.3.40 = STRING: "/run/lock"
    iso.3.6.1.2.1.25.2.3.1.3.41 = STRING: "/sys/fs/cgroup"
    iso.3.6.1.2.1.25.2.3.1.3.59 = STRING: "/tmp"
    iso.3.6.1.2.1.25.2.3.1.3.60 = STRING: "/run/cgmanager/fs"
    iso.3.6.1.2.1.25.2.3.1.3.61 = STRING: "/run/user/112"
    iso.3.6.1.2.1.25.2.3.1.3.63 = STRING: "/run/user/0"
    

    So I tried this code :

    #!/usr/bin/env python3
    from pysnmp.hlapi import *
    
    def walk(host, oid):
        for (errorIndication,errorStatus,errorIndex,varBinds) in nextCmd(SnmpEngine(), 
            CommunityData('public'), UdpTransportTarget((host, 161)), ContextData(), 
            ObjectType(ObjectIdentity(oid))):
            if errorIndication:
                print(errorIndication, file=sys.stderr)
                break
            elif errorStatus:
                print('%s at %s' % (errorStatus.prettyPrint(),
                                    errorIndex and varBinds[int(errorIndex) - 1][0] or '?'), 
                                    file=sys.stderr)             
                break
            else:
                for varBind in varBinds:
                    print(varBind)
    
    walk('192.168.0.10','1.3.6.1.2.1.25.2.3.1.3')
    

    and the problem is that it returns a lot of unwanted OIDs…

    I tried different things, like using the getCmd() function but I can’t manage to have it working the way I want.

    I could call the external snmpwalk command from my Python code but I’d prefer to find a solution using the Python module.

    Any idea to help me?