snmpget成功返回,但是snmpset声称不存在相同的OID



我正在使用CyberPower PDU:https://www.cyberpowersystems.com/product/pdu/switched-ats/pdu15swhviec12atnet/

根据snmpwalk -v1 -m CyberPower_MIB_v2.9.MIB -c public 10.42.0.2 iso.3.6.1.4.1.3808,管理卡型号为RMCARD205,型号全称为PDU15SWHVIEC12ATNET

我想以编程方式控制端口的电源,通过SNMP这样做似乎是最稳健的选择。我可以用查询端口3的状态

# snmpget -v1 -c private 10.42.0.2 iso.3.6.1.4.1.3808.1.1.5.6.3.1.3.3
SNMPv2-SMI::enterprises.3808.1.1.5.6.3.1.3.3 = INTEGER: 2

也就是说,OIDiso.3.6.1.4.1.3808.1.1.5.6.3.1.3.3清楚地存在并且具有值2(在这种情况下意味着OFF(。现在,让我将其设置为1(意思是ON(,具有整数值类型(在SNMP中编码为i(,

snmpset -v1 -c private 10.42.0.2 iso.3.6.1.4.1.3808.1.1.5.6.3.1.3.3 i 1
Error in packet.
Reason: (noSuchName) There is no such variable name in this MIB.
Failed object: SNMPv2-SMI::enterprises.3808.1.1.5.6.3.1.3.3

我在这个SO问题中发现了一个答案,表明这些设备出现错误并不罕见,但其行为与我在这里看到的有点不同。同样,SNMP常见问题解答没有为我提供任何关于这个问题的具体建议

上面的交互似乎证明了设备有故障,但SNMP足够疯狂,如果我真的应该做一些奇怪的事情来让它工作,我不会感到惊讶。

我找到了问题的答案,并将在这里发布一些详细信息,以防其他人和我一样困惑!

第一个技巧是使用设备制造商的MIB文件。CyberPower发布了一个MIB文件(基本上是硬件设备中所有属性的文本描述(,该文件允许net-snmp工具打印不透明OID的描述性名称。例如,在将MIB文件下载到当前工作目录之后,为了查看我试图在上面设置的内容

# snmpwalk -v1 -c private -M +.  -m ALL  10.42.0.2 iso.3.6.1.4.1.3808.1.1.5.6.3.1.3
CPS-MIB::atsOutletStatusOutletState.1 = INTEGER: outletStatusOn(1)
CPS-MIB::atsOutletStatusOutletState.2 = INTEGER: outletStatusOn(1)
CPS-MIB::atsOutletStatusOutletState.3 = INTEGER: outletStatusOff(2)
CPS-MIB::atsOutletStatusOutletState.4 = INTEGER: outletStatusOff(2)
CPS-MIB::atsOutletStatusOutletState.5 = INTEGER: outletStatusOn(1)
CPS-MIB::atsOutletStatusOutletState.6 = INTEGER: outletStatusOn(1)
CPS-MIB::atsOutletStatusOutletState.7 = INTEGER: outletStatusOn(1)
CPS-MIB::atsOutletStatusOutletState.8 = INTEGER: outletStatusOn(1)
CPS-MIB::atsOutletStatusOutletState.9 = INTEGER: outletStatusOn(1)
CPS-MIB::atsOutletStatusOutletState.10 = INTEGER: outletStatusOn(1)
CPS-MIB::atsOutletStatusOutletState.11 = INTEGER: outletStatusOn(1)
CPS-MIB::atsOutletStatusOutletState.12 = INTEGER: outletStatusOn(1)

起初,这似乎是更改状态的正确位置,但与我遇到的其他PDU不同,除了上面用于状态操作的OID树之外,这个PDU还有一个用于控制操作的单独OID树,

# snmpwalk -v1 -c private -M +.  -m ALL  10.42.0.2 iso.3.6.1.4.1.3808.1.1.5.6.5
CPS-MIB::atsOutletCtrlTableIndex.1 = INTEGER: 1
CPS-MIB::atsOutletCtrlTableIndex.2 = INTEGER: 2
CPS-MIB::atsOutletCtrlTableIndex.3 = INTEGER: 3
CPS-MIB::atsOutletCtrlTableIndex.4 = INTEGER: 4
CPS-MIB::atsOutletCtrlTableIndex.5 = INTEGER: 5
CPS-MIB::atsOutletCtrlTableIndex.6 = INTEGER: 6
CPS-MIB::atsOutletCtrlTableIndex.7 = INTEGER: 7
CPS-MIB::atsOutletCtrlTableIndex.8 = INTEGER: 8
CPS-MIB::atsOutletCtrlTableIndex.9 = INTEGER: 9
CPS-MIB::atsOutletCtrlTableIndex.10 = INTEGER: 10
CPS-MIB::atsOutletCtrlTableIndex.11 = INTEGER: 11
CPS-MIB::atsOutletCtrlTableIndex.12 = INTEGER: 12
CPS-MIB::atsOutletCtrlOutletName.1 = STRING: "Outlet1"
CPS-MIB::atsOutletCtrlOutletName.2 = STRING: "Outlet2"
CPS-MIB::atsOutletCtrlOutletName.3 = STRING: "Outlet3"
CPS-MIB::atsOutletCtrlOutletName.4 = STRING: "Outlet4"
CPS-MIB::atsOutletCtrlOutletName.5 = STRING: "Outlet5"
CPS-MIB::atsOutletCtrlOutletName.6 = STRING: "Outlet6"
CPS-MIB::atsOutletCtrlOutletName.7 = STRING: "Outlet7"
CPS-MIB::atsOutletCtrlOutletName.8 = STRING: "Outlet8"
CPS-MIB::atsOutletCtrlOutletName.9 = STRING: "Outlet9"
CPS-MIB::atsOutletCtrlOutletName.10 = STRING: "Outlet10"
CPS-MIB::atsOutletCtrlOutletName.11 = STRING: "Outlet11"
CPS-MIB::atsOutletCtrlOutletName.12 = STRING: "Outlet12"
CPS-MIB::atsOutletCtrlCommand.1 = INTEGER: none(1)
CPS-MIB::atsOutletCtrlCommand.2 = INTEGER: none(1)
CPS-MIB::atsOutletCtrlCommand.3 = INTEGER: none(1)
CPS-MIB::atsOutletCtrlCommand.4 = INTEGER: none(1)
CPS-MIB::atsOutletCtrlCommand.5 = INTEGER: none(1)
CPS-MIB::atsOutletCtrlCommand.6 = INTEGER: none(1)
CPS-MIB::atsOutletCtrlCommand.7 = INTEGER: none(1)
CPS-MIB::atsOutletCtrlCommand.8 = INTEGER: none(1)
CPS-MIB::atsOutletCtrlCommand.9 = INTEGER: none(1)
CPS-MIB::atsOutletCtrlCommand.10 = INTEGER: none(1)
CPS-MIB::atsOutletCtrlCommand.11 = INTEGER: none(1)
CPS-MIB::atsOutletCtrlCommand.12 = INTEGER: none(1)

可以设置CPS-MIB::atsOutletCtrlCommand树,通过执行以下操作来更改出口状态,

# snmpset -M +. -m ALL -v1 -c private 10.42.0.2 SNMPv2-SMI::enterprises.3808.1.1.5.6.5.1.3.3 i 3
CPS-MIB::atsOutletCtrlCommand.3 = INTEGER: immediateOff(3)

端口更改状态。可以通过查阅上面提到的MIB文件(在本文中,是一个名为CyberPower_MIB_v2.9.MIB的文件(来找到状态映射。例如,我发现了以下定义,这些定义帮助我了解了哪个整数表示off/on等等,

...
atsOutletCtrlCommand OBJECT-TYPE
SYNTAX INTEGER {
none                                        (1),
immediateOn                         (2),
immediateOff                        (3),
immediateReboot                 (4),
delayedOn                               (5),
delayedOff                          (6),
delayedReboot                       (7),
cancelPendingCommand        (8)
}
...

在这里,可以看出,关闭一个端口,它是整数3,打开是2,依此类推

为什么SNMP工具没有给出更清晰的错误,这对我来说仍然是个谜(noSuchName具有误导性,名称非常确实存在,它只是只读的,但这就是技术中的生命(

最新更新