snmpwalk с PySNMP

Я хотел бы воспроизвести поведение следующей команды SNMP:

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, но я бы предпочел найти решение с помощью модуля Python.

Любая идея, чтобы помочь мне?


person Stéphane    schedule 09.07.2017    source источник


Ответы (1)


Попробуйте передать lexicographicMode аргумент ключевого слова для nextCmd(). Например:

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

Это должно иметь эффект ограничения обхода SNMP начальным OID, который вы ему даете (при условии, что нежелательные OID, которые вы упомянули, исходят из префикса).

person Ilya Etingof    schedule 09.07.2017
comment
Большое спасибо! Это исправило мою проблему. - person Stéphane; 10.07.2017