2017-07-25 121 views
0

我的筆記本電腦上開發的腳本在那裏運行得很好,但是在遠程服務器上它並沒有返回我期望的結果。PySNMP在不同的機器上返回不同的值

我的服務器有這樣的輸出:

Python 2.7.5 (default, Jun 17 2014, 18:11:42) 
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pysnmp 
>>> print pysnmp.__version__ 
4.2.5 
>>> 
>>> from pysnmp.entity.rfc3413.oneliner import cmdgen 
>>> cmdGen = cmdgen.CommandGenerator() 
>>> 
>>> errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.nextCmd(
...  cmdgen.CommunityData('communitystringhere'), 
...  cmdgen.UdpTransportTarget(('10.10.10.10', 161)), 
...  '1.3.6.1.2.1.2.2.1.2', 
...  lookupNames=True, lookupValues=True) 
>>>  
... for varBindTableRow in varBindTable: 
...  for val in varBindTableRow: 
...   print val 
... 
(MibVariable(ObjectName(1.3.6.1.2.1.2.2.1.2.1)), OctetString('fxp0')) 
(MibVariable(ObjectName(1.3.6.1.2.1.2.2.1.2.4)), OctetString('lsi')) 
(MibVariable(ObjectName(1.3.6.1.2.1.2.2.1.2.5)), OctetString('dsc')) 
(MibVariable(ObjectName(1.3.6.1.2.1.2.2.1.2.6)), OctetString('lo0')) 
[Output truncated...] 

的結果是一個MibVariable和八位組。

在我的筆記本電腦,我得到如下:

Python 2.7.10 (default, Feb 7 2017, 00:08:15) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pysnmp 
>>> print pysnmp.__version__ 
4.3.2 
>>> 
>>> from pysnmp.entity.rfc3413.oneliner import cmdgen 
>>> [code ommitted, same as above...] 
... 
SNMPv2-SMI::mib-2.2.2.1.2.1 = fxp0 
SNMPv2-SMI::mib-2.2.2.1.2.4 = lsi 
SNMPv2-SMI::mib-2.2.2.1.2.5 = dsc 
SNMPv2-SMI::mib-2.2.2.1.2.6 = lo0 
[Output truncated...] 

我不知道什麼可以做不同的回報pysnmp比次要版本等 - 但舊版本(在服務器上),似乎比我的筆記本電腦上的'新版'有更好的輸出?

我錯過了一些明顯的東西嗎?

回答

1

你是對的,MibVariable對象(或ObjectType在以後的版本中pysnmp)的默認str表示輕微pysnmp版本之間的變化...

你可以叫上varBind.prettyPrint()?這將有希望產生在不同pysnmp版本統一表示:

for varBindTableRow in varBindTable: 
    for varBind in varBindTableRow: 
    print(varBind.prettyPrint()) 

由於黑客的問題,你可能模仿老str表示這樣的:

... 
>>> varBind = varBinds[0] 
>>> name, value = varBind 
>>> '%s(%s(%s), %s(%s))' % (
    type(varBind).__name__, 
    type(name).__name__, 
    name, 
    type(value).__name__, 
    value 
) 
'ObjectType(ObjectIdentity(1.3.6.1.2.1.1.1.0), DisplayString(Linux zeus 4.8.6.5-smp #2 SMP Sun Nov 13 14:58:11 CDT 2016 i686))' 
+0

感謝您的幫助,我結束了使用類似的方法來模仿你的。 –

+0

雖然我不確定你在這裏的最終目標是什麼?你需要知道返回的確切的SNMP類型嗎? –

+0

不,我基本上只是試着走那個OID來找回所有的值。我有一個搜索字符串,我試圖在該表中找到,OID的最後一部分是我正在尋找的東西的索引。 –