代码之家  ›  专栏  ›  技术社区  ›  Stéphane

使用PySNMP的snmpwalk

  •  4
  • Stéphane  · 技术社区  · 7 年前

    snmpwalk -v2c -cpublic 192.168.0.10 1.3.6.1.2.1.25.2.3.1.3
    

    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"
    

    所以我尝试了这个代码:

    #!/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')
    

    问题是它返回了很多不需要的OID

    我尝试了不同的方法,比如使用 getCmd() 功能,但我不能管理它的工作方式,我想要的。

    snmpwalk 命令,但我更喜欢使用Python模块找到解决方案。

    有什么办法帮我吗?

    1 回复  |  直到 6 年前
        1
  •  8
  •   Ilya Etingof    7 年前

    试着通过 lexicographicMode 关键字参数 nextCmd()

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

    这应该具有通过您提供的初始OID来限制SNMP遍历的效果(假设您提到的不需要的OID是那些超出前缀的OID)。