snmpget returns 成功,但 snmpset 声称相同的 OID 不存在

snmpget returns successfully, yet snmpset claims the same OID does not exist

我正在使用 Cyber​​Power 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

我找到了in this SO question an answer suggesting it's not at all uncommon for these devices to have bugs, but the behaviour was a bit different to what I've got here. Similarly, the SNMP FAQ didn't offer any specific advice on this issue for me

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

我找到了我的问题的答案,并且会post在这里提供一些细节,以防其他人和我一样困惑!

第一个技巧是使用设备制造商的 MIB 文件。 Cyber​​Power 发布了一个单一的 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 与我遇到的其他 PDU 不同,除了上面用于状态操作的 OID 树之外,还有一个单独的 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,on是2,以此类推

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