編輯:
利用SNMP,標MIB的OID的對象實例總是0.0結束。但是,表格MIB對象實例也可以以'.0'(RFC 2578,7.7(2))結束。請注意這裏的單詞實例。 MIB對象永遠不會(?)以.0結尾我想。
MIB對象存在於MIB文件中,而不是MIB對象實例,它們由實時SNMP代理實現和報告。 OID明智地說,MIB對象(父)與MIB對象實例(標量子項,表列子項)之間存在父子關係。
讓我爲您提供這個簡單的腳本。它遍歷從MIB文件加載的OID樹(因此它僅處理MIB對象)。通過測試mibNode
類,您可以確定對象是列狀(MibTableColumn
)還是標量(MibScalar
)或SNMP SMI可能提供的其他任何內容。
from pysnmp.smi import builder, view, compiler, error
mibBuilder = builder.MibBuilder()
# Optionally attach PySMI MIB compiler to deal with ASN.1 MIBs
#compiler.addMibCompiler(mibBuilder, sources=['/usr/share/snmp/mibs'])
mibBuilder.loadModules('SNMPv2-MIB', 'SNMP-FRAMEWORK-MIB', 'SNMP-COMMUNITY-MIB')
mibView = view.MibViewController(mibBuilder)
oid, label, suffix = mibView.getFirstNodeName()
while True:
try:
modName, nodeDesc, suffix = mibView.getNodeLocation(oid)
mibNode, = mibBuilder.importSymbols(modName, nodeDesc)
print('%s::%s (%s) -> %s' % (modName, nodeDesc, '.'.join([str(x) for x in oid]), type(mibNode).__name__))
oid, label, suffix = mibView.getNextNodeName(oid)
except error.NoSuchObjectError:
break
這裏其輸出的一個片段只給你一個想法:
...
SNMPv2-MIB::system (1.3.6.1.2.1.1) -> MibIdentifier
SNMPv2-MIB::sysDescr (1.3.6.1.2.1.1.1) -> MibScalar
SNMPv2-MIB::sysObjectID (1.3.6.1.2.1.1.2) -> MibScalar
SNMPv2-MIB::sysUpTime (1.3.6.1.2.1.1.3) -> MibScalar
...
SNMP-TARGET-MIB::snmpTargetParamsTable (1.3.6.1.6.3.12.1.3) -> MibTable
SNMP-TARGET-MIB::snmpTargetParamsEntry (1.3.6.1.6.3.12.1.3.1) -> MibTableRow
SNMP-TARGET-MIB::snmpTargetParamsName (1.3.6.1.6.3.12.1.3.1.1) -> MibTableColumn
SNMP-TARGET-MIB::snmpTargetParamsMPModel (1.3.6.1.6.3.12.1.3.1.2) -> MibTableColumn
SNMP-TARGET-MIB::snmpTargetParamsSecurityModel (1.3.6.1.6.3.12.1.3.1.3) -> MibTableColumn
...
如果你想轉移是基於對MIB節點類型,你可以使用isinstance()
對MIB對象,如MibScalar
,MibTableColumn
等。要獲取這些類,可以像下面這樣從核心MIB中導入它們:
MibScalar, MibTableColumn = mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalar', 'MibTableColumn')
非零單個索引指示表格對象,但反過來i這不是真的。雖然INTEGER索引的確如此,但對於其他類型的值,.0在表格對象中是合法的。請參閱RFC 2578,7.7(2)及以下。例如。一個固定長度的1字符OCTET STRING。很少見。 –
@Ilya,但是當我使用PYSNMP瀏覽MIB時,像systemName這樣的標量oid不會以.0結尾。有沒有辦法做到這一點? – sbhatta
@ user3502325如果您正在瀏覽MIB定義而不是執行該MIB的SNMP代理程序,那麼您將獲得可能以任何內容結尾的MIB對象。當你瀏覽SNMP代理時,你得到的是MIB對象*實例* - 其中的OID包括(尾部)索引部分,它具有我們剛纔討論的'.0'情況。 –