snmpget returns 成功,但 snmpset 声称相同的 OID 不存在
snmpget returns successfully, yet snmpset claims the same OID does not exist
我正在使用 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
我找到了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 文件。 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 与我遇到的其他 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
具有误导性,这个名字非常 确实存在 ,它只是只读,但这就是科技生活)
我正在使用 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
我找到了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 文件。 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 与我遇到的其他 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
具有误导性,这个名字非常 确实存在 ,它只是只读,但这就是科技生活)