2012-11-12 38 views
0

根據文檔setCmd varBinds引用是一系列管理對象。然而,我試圖通過一個列表[(oid0, value0), (oid1, value1)]或一個元組((oid0, value0), (oid1, value1))或一組set([(oid0, value0), (oid1, value1)])和他們都失敗,錯誤「太多的值解壓縮」。我需要能夠使用多個varbind發送一個設置請求。我可以成功發送每個託管對象,例如(oid0,value0)作爲單獨的setCmd。任何想法我可以做到這一點?管理對象上的pySNMP序列setCmd

+0

我發現了一個極爲不便的方式來做到這一點。我基本上必須產生一個管理對象的字符串,並使用eval()。即set命令看起來像這樣: – scriptOmate

+0

#ABC = [(oid0,value0),(OID1,值1),(OID2,值2)] \t mo_str = '' 在 \t每個ABC: \t mo_str = STR (各)+ '' errorIndication,ErrorStatus中,errorIndex,的varbind = cmdgen.CommandGenerator()SETCMD( self.authData, cmdgen.UdpTransportTarget((HOST_ADDR,161)), 的eval(mo_str [: - 1] )) \t \t 這是非常不方便的編程。 – scriptOmate

+0

還有其他方法可以做到嗎? – scriptOmate

回答

1

on the examples page所示,向setCmd()傳遞可變數量的(oid,value)元組是一種將多個var-bind添加到請求消息的方法。

下面的代碼將建立,有三個變種,結合發送SNMP SET消息:

cmdGen.setCmd(
    cmdgen.CommunityData('public'), 
    cmdgen.UdpTransportTarget(('localhost', 161)), 
    ('1.3.6.1.2.1.1.2.0', rfc1902.ObjectName('1.3.6.1.4.1.20408.1.1')), 
    ('1.3.6.1.2.1.1.2.0', '1.3.6.1.4.1.20408.1.1'), 
    ('1.3.6.1.2.1.1.5.0', rfc1902.OctetString('new system name')) 
) 
+0

我知道這個例子說了什麼,但正如我所說的,沒有辦法提供這種形式的變量。這個例子對於上面的固定值非常有用,但是試着將變量設置爲多個varbinds。它不起作用。 – scriptOmate

1

嘗試星號

abc = ((oid0, value0), (oid1, value1), (oid2, value2)) 
errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().setCmd(
    self.authData, cmdgen.UdpTransportTarget((host_addr, 161)), *abc)