为什么 net-snmp 在出现“此代理上此 OID 上无可用对象”错误后会退出并将0
错误消息打印到 ,STDOUT
而其他错误会打印到STDERR
并具有退出状态1
?比较:
$ /usr/bin/snmpget -Oqv -v2c -cpublic localhost .1.3.6.1.2.1.2.1.0 2> /dev/null
No Such Object available on this agent at this OID
$ echo $?
0
但是,错误的社区字符串或 IP 地址的处理方式不同(例如“publi”而不是“public”):
$ /usr/bin/snmpget -Oqv -v2c -cpubli localhost .1.3.6.1.2.1.2.1.0 2>&1 > /dev/null
Timeout: No Response from localhost.
$ echo $?
1
这真的很烦人,因为我正在尝试编写一个函数来执行一些健全性检查,以确保某些 MIB/OID 确实可用于要查询的代理。我希望能够做这样的事情(在 bash 脚本中):
snmp_sanity_checks() {
...
if ! err=$($snmpcmd); then
echo "ERROR: $err"
exit $UNKNOWN
fi
...
}
有人知道这个原因吗以及我该如何“解决”它?
谢谢
答案1
作为另一种解决方法,您可以这样做:
snmp_sanity_checks() {
...
if ! err=$($snmpcmd); then
echo "ERROR: $err"
exit $UNKNOWN
elif [[ $err == 'No Such Object'* ]]; then
echo "ERROR: $err"
exit $UNKNOWN
fi
...
}
或者如果你想以相同的方式处理这两种情况,那么这也有效:
snmp_sanity_checks() {
...
if ! err=$($snmpcmd) || [[ $err == 'No Such Object'* ]]; then
echo "ERROR: $err"
exit $UNKNOWN
fi
...
}