1

我有两个脚本从 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 中,我为两个脚本添加了一个扩展部分,该部分采用该数字并将其与本示例 Get_rxMbps 中表示的 OID 相关联:

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 来查看和使用该数字作为整数而不是字符串。

4

2 回答 2

0

The types are defined in the corresponding MIB file which you shouldn't modify unless you are the author of this file.

You can tell snmpwalk, snmpget and similar commands to remove the type information by passing option -OQ but this will still lead to strings being quoted (at least for my snmpwalk command).

I suggest to either adapt your monitoring software or pass the SNMP output through a script which will convert/remove the string type information accordingly.

于 2013-11-04T14:54:08.213 回答
0

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

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

您可以从这个展示多种扩展方法的示例中获得一些灵感,这里有更详细的描述。

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

于 2019-06-29T20:19:28.067 回答