1. ホーム
  2. python-3.x

[解決済み] PySNMP による snmpwalk

2022-02-17 07:49:33

質問

以下の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モジュールを使用して解決策を見出すことを希望します。

何かいい方法はないでしょうか?

どのように解決するのですか?

を渡してみてください。 辞書モード キーワード引数を nextCmd() . 例えば、以下のようになります。

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

これにより、SNMPウォークに与える初期OIDに上限を設定する効果があります(ここで言う不要なOIDとは、プレフィックスから外れるOIDのことだと仮定します)。