使用 Nagios,我想读取数百个 Ubiquity 设备的设备名称。此值在其中一些设备上有一个 OID,在其他设备上有另一个 OID。到目前为止,我找到的最佳方法是使用此脚本:
$1/check_snmp -H $2 -o .1.2.840.10036.3.1.2.1.3.5 > /tmp/$2.snmp.nagios.tmp
status=$?
if [ $status -ne 0 ]; then
$1/check_snmp -H $2 -o .1.2.840.10036.3.1.2.1.3.9 > /tmp/$2.snmp.nagios.tmp
status=$?
fi
cat /tmp/$2.snmp.nagios.tmp
exit $status
我不喜欢的是它使用文件系统,但我不知道如何将命令的输出读到一个变量并将命令的退出代码读到另一个变量。
有没有办法编写这个程序以便它只使用变量?
难道没有更好的方法来实现主要目标吗?
答案1
您可以直接使用命令 snmpget 而不是 check_snmp,因为 check_snmp 将使用 snmpget(或 netsnmp 工具的其他工具)并处理存储在变量中的结果。
我在这里粘贴了我使用的脚本的骨架:
function control_error {
echo "UNKNOWN : Error during operation"
exit 3
}
drive="$(snmpget -v1 -Ovq -c <community snmpv1> $IPadress .1.3.6.1.4.1.2.3.51.3.1.13.1.3.1.2.$i)"
if [ $? != 0 ]; then control_error;fi
drive="$(echo $drive | sed -e 's/"//g')"
...
该脚本读取 OID 并将结果存储在变量驱动器中。
它测试 snmpget 的事件错误,如果有问题则返回 3(nagios 未知)。
snmpget 选项包括:
- -v1 版本的 snmp
- -c 社区
- -Ovq OUPUT 选项仅返回结果而不返回所要求的 OID
之后,您可以使用 echo 和 sed 来处理变量,例如在此脚本中
答案2
我通常这样做:
data=$(your command)
result=$?
这样,您就可以在 中获得命令的输出$data
,并在 中获得返回代码$result
。但也许还有更好的方法。