【问题标题】:Force SNMP to see number as Integer强制 SNMP 将数字视为整数
【发布时间】:2013-11-04 14:19:09
【问题描述】:

我有两个脚本从 SAR 中获取值并将它们放在一个日志文件中(一个示例):

rxkBps=`sar -n DEV 1 295 | tail -n1 | awk '{print $5}'`
rxMbps=$(echo "scale=2;$rxkBps/128" | bc -l)
echo $rxMbps >./rxMbps.log
exit

该数字始终是十进制数(例如:0.06)。
在 snmpd.conf 中,我为两个脚本添加了一个扩展部分,该部分采用该数字并将其与其 OID 相关联,在此示例中由 Get_rxMbps 表示:

extend Get_rxMbps /bin/sh /usr/local/bin/Get_rxMbps.sh

当我在 NET-SNMP-EXTEND-MIB::nsExtendObjects 上运行 snmpwalk 时,我会返回信息,但它会将其视为字符串,我们的监控软件无法转换或使用字符串信息。

NET-SNMP-EXTEND-MIB::nsExtendCommand."Get_rxMbps" = STRING: /bin/sh
NET-SNMP-EXTEND-MIB::nsExtendArgs."Get_rxMbps" = STRING: /usr/local/bin/Get_rxMbps.sh
NET-SNMP-EXTEND-MIB::nsExtendInput."Get_rxMbps" = STRING:
NET-SNMP-EXTEND-MIB::nsExtendCacheTime."Get_rxMbps" = INTEGER: 5
NET-SNMP-EXTEND-MIB::nsExtendExecType."Get_rxMbps" = INTEGER: exec(1)
NET-SNMP-EXTEND-MIB::nsExtendRunType."Get_rxMbps" = INTEGER: run-on-read(1)
NET-SNMP-EXTEND-MIB::nsExtendStorage."Get_rxMbps" = INTEGER: permanent(4)
NET-SNMP-EXTEND-MIB::nsExtendStatus."Get_rxMbps" = INTEGER: active(1)
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."Get_rxMbps" = STRING: .83
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."Get_rxMbps" = STRING: .83
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."Get_rxMbps" = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendResult."Get_rxMbps" = INTEGER: 0
NET-SNMP-EXTEND-MIB::nsExtendOutLine."Get_rxMbps".1 = STRING: .83

我是新手,继承了别人的工作,所以如果有更好的方法我也愿意,但我需要 SNMP 来查看和使用该数字作为整数而不是字符串。

【问题讨论】:

  • 了解 SNMP 不支持任何类型的十进制(或浮点)数字可能会很有趣。可能是因为它们在 BER 中的编码会很复杂。鉴于此,我认为将十进制数作为字符串发送是完全合适的。它必须在接收端进行转换。

标签: linux bash snmp


【解决方案1】:

类型在相应的 MIB 文件中定义,除非您是该文件的作者,否则您不应修改该文件。

您可以通过传递选项-OQ 告诉snmpwalksnmpget 和类似命令来删除类型信息,但这仍然会导致字符串被引用(至少对于我的snmpwalk 命令而言)。

我建议调整您的监控软件或通过脚本传递 SNMP 输出,该脚本将相应地转换/删除字符串类型信息。

【讨论】:

  • 我无法调整我的监控软件,我没有那种访问权限或能力。甚至通过 python 传递这些信息,将其声明为 int,它仍然将其作为字符串读取。
【解决方案2】:

你不能;这是“扩展”功能的限制。 NET-SNMP-EXTEND-MIB::nsExtendOutputFull 行是 STRINGs,句号。您的数据必须符合 NET-SNMP-EXTEND-MIB 定义,实际上别无选择,只能将所有内容作为字符串发送(因为类型在 MIB 时是固定的)。

听起来您想正确地为您自己的 MIB 定义一个子代理,可能使用 AgentX 功能。但是,您需要为此在监控软件中添加支持,除非您可以接受它不了解它接收的信息。

您也许可以从this example that shows multiple extension methods 中获得一些灵感,详细描述here

(我很想建议作弊,并将您的值作为脚本的返回码而不是作为其文本输出传递给 Net-SNMP;然后你会在 NET-SNMP-EXTEND-MIB::nsExtendResult 中将其作为 @ 987654327@。但是,我不知道 Net-SNMP 是否对返回码有限制,除非你解决了,否则这将是一个小技巧。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多