networking - 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),具有整数值类型(如i
SNMP 中编码),
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 question 中找到了一个答案,表明这些设备存在错误并不少见,但行为与我在这里得到的有点不同。同样,SNMP FAQ 没有为我提供关于这个问题的任何具体建议。
上面的交互似乎证明了设备有故障,但是 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 树之外,它还有一个单独的 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,打开是2,以此类推。
对我来说,为什么 SNMP 工具没有给出更清晰的错误仍然是个谜(noSuchName
具有误导性,这个名字确实存在,它只是只读的,但这就是科技生活)
推荐阅读
- java - 如何有效地返回给定位数的最大可能整数
- javascript - 在 symfony4 树枝模板中分离 JavaScripts 文件
- image - 如何在 vuetify 中设置轮播图像的大小
- string - 多行中的 LLVM IR 字符串文字
- java - 如何在使用 Logstash 摄取到 ElasticSearch 的 JSON 文件中使用 Java 处理 HTML 内容?
- django-forms - 使用 django-form 在 ParentalManyToManyField wagtail 中检查默认特定选项
- javascript - 如何使用 AWS IoT 组一次更新组设备影子?
- vba - VBA向使用RangetoHTML(rng to Range)功能的电子邮件添加签名
- kubernetes - 有没有办法根据特定的元数据标签获取命名空间
- c - tdm-gcc 的 mingw32-gcc 抛出“缺少参数”错误