2011-12-27 13 views
1

私は簡単なsnmp GETNEXTクエリを作成して、のツリー階層内の指定されたOIDの次の項目のみを検索しようとしています。例えばPySNMPで単一のGETNEXTクエリを作成する方法

は、私が欲しいのです:

iはOIDとGETNEXT要求を行うと1.3.6.1.2.1.1(iso.org.dod.internet.mgmt.mib- 2.system)

私はOID 1.3.6.1.2.1.1.1.0(iso.org.dod.internet.mgmt.mib-2.system.sysDescr含む単一応答を得ることを期待します.0)を対応する値で置き換えます。

事実である:単一の次の値を取得する

Insted、PySNMPは1.3.6.1.2.1.1下SNMPウォークを実行し、すべてのサブアイテムを検索します。

この動作を変更して、snmpwalkを実行する代わりに、ただ1つの次の値を返すようにするにはどうすればよいですか?

私はPySNMPのドキュメントから次のコードを使用します。

# GETNEXT Command Generator 
from pysnmp.entity.rfc3413.oneliner import cmdgen 

errorIndication, errorStatus, errorIndex, \ 
       varBindTable = cmdgen.CommandGenerator().nextCmd(
    cmdgen.CommunityData('test-agent', 'public'), 
    cmdgen.UdpTransportTarget(('localhost', 161)), 
    (1,3,6,1,2,1,1) 
    ) 

if errorIndication: 
    print errorIndication 
else: 
    if errorStatus: 
     print '%s at %s\n' % (
      errorStatus.prettyPrint(), 
      errorIndex and varBindTable[-1][int(errorIndex)-1] or '?' 
      ) 
    else: 
     for varBindTableRow in varBindTable: 
      for name, val in varBindTableRow: 
       print '%s = %s' % (name.prettyPrint(), val.prettyPrint()) 

答えて

3

は@Cankut、pysnmpの「oneliner」GETNEXTのAPIは、指定された接頭辞の下にあるすべてのOIDまたはエンドの-MIBまでのすべてのOIDのいずれかを取得することで動作します。

from pysnmp.entity.rfc3413.oneliner import cmdgen 

def cbFun(sendRequestHandle, errorIndication, errorStatus, errorIndex, 
      varBindTable, cbCtx): 
    if errorIndication: 
     print(errorIndication) 
     return 1 
    if errorStatus: 
     print(errorStatus.prettyPrint()) 
     return 1 
    for varBindRow in varBindTable: 
     for oid, val in varBindRow: 
      print('%s = %s' % (oid.prettyPrint(), 
           val and val.prettyPrint() or '?')) 

cmdGen = cmdgen.AsynCommandGenerator() 

cmdGen.nextCmd(
    cmdgen.CommunityData('test-agent', 'public'), 
    cmdgen.UdpTransportTarget(('localhost', 161)), 
    ((1,3,6,1,2,1,1),), 
    (cbFun, None) 
) 

cmdGen.snmpEngine.transportDispatcher.runDispatcher() 
+0

あなたがそう答える:あなたは(それも少し低レベルの非同期APIを使用して必要になります)、独自にpysnmpの株式応答処理機能を置き換えることであろう何をしたいことの

一つの方法Stack Overflowに関する多くの質問は、アカウントに登録するのが理にかなっているので、すべての回答を単一のユーザーIDにまとめることができます –

+0

@Ilyaありがとう、これが私が探していたものです。 – Cankut

-2
errorIndication, errorStatus, errorIndex, \ 
       varBindTable = cmdgen.CommandGenerator().nextCmd(
    cmdgen.CommunityData('test-agent', 'public'), 
    cmdgen.UdpTransportTarget(('localhost', 161)), 
    (1,3,6,1,2,1,1),maxRows=1 
    ) 
+2

ようこそStackOverflowへ。投稿したコードに説明を追加することは慣例的なので、誰もがよりよく学ぶことができます。ありがとうございました。 – phant0m

関連する問題