如何解决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
也就是说,OID iso.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 的答案表明这些设备存在错误的情况并不少见,但行为与我在此处获得的行为略有不同。同样,the SNMP FAQ didn't offer any specific advice on this issue for me。
似乎上述交互证明了设备有问题,但 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
的文件)找到。例如,我发现以下定义帮助我了解哪个整数代表关/开等等,
...
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
具有误导性,该名称确实存在,它只是只读的,但是这就是科技生活)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。