2016-10-31 174 views
0

請原諒我,如果這是一件很簡單的事情,但我是Python,pysnmp和SNMP的新手。使用pysnmp獲取輸出

我試圖運行一些非常簡單的查詢使用SNMP從設備獲取配置信息,並出於某種原因遵循文檔here

儘管我可以通過snmpwalk和googling來瀏覽SNMP,但我並沒有收到任何輸出,似乎只是顯示了我下面的示例。

我的代碼是

#!/usr/bin/python3.5 

from pysnmp.hlapi import * 

varCommunity = "public" 
varServer = "demo.snmplabs.com" 
varPort = 161 

g = getCmd(SnmpEngine(), 
     CommunityData(varCommunity), 
     UdpTransportTarget((varServer, varPort)), 
     ContextData(), 
     ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0))) 

next(g) 

如果我添加

print(g) 

我會得到下面的輸出

<generator object getCmd at 0x7f25964847d8> 

回答

1
next(g) 

將從發電機返回的下一個值。如果你在Python控制檯中輸入這段代碼,你會看到實際的結果。但是,由於您是通過文件運行的,因此結果將被丟棄。

您需要在其周圍放置print。例如。

print(next(g)) 

爲了便於調試,你可以得到所有的結果是這樣的名單:

print(list(g)) 
+0

有沒有辦法只返回值? 例如返回值「demo.snmplabs.com」 – Laywah

+0

我不知道我明白你在問什麼,但我一般沒有使用'pysnmp'或SNMP的經驗。使用'next(g)'是我猜測的。網絡協議本質上是異步的,這就是爲什麼庫返回一個生成器而不是簡單的值。 – svens

0

這是你的原劇本有一些變化,並評論說,希望會得到你了pysnmp加快:

from pysnmp.hlapi import * 

varCommunity = "public" 
varServer = "demo.snmplabs.com" 
varPort = 161 

g = getCmd(SnmpEngine(), 
      CommunityData(varCommunity), 
      UdpTransportTarget((varServer, varPort)), 
      ContextData(), 
      ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0))) 

# this is what you get from SNMP agent 
error_indication, error_status, error_index, var_binds = next(g) 

if not error_indication and not error_status: 
    # each element in this list matches a sequence of `ObjectType` 
    # in your request. 
    # In the code above you requested just a single `ObjectType`, 
    # thus we are taking just the first element from response 
    oid, value = var_binds[0] 
    print(oid, '=', value) 

您可能會發現pysnmp documentation富有洞察力。 ;-)