SNMP错误报告到标准输出

为什么net-snmp在这个OID上没有这个对象在这个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 

但是,错误的社区string或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 

这真是让人恼火,因为我试图编写一个function来进行一些理智的检查,以确保某些MIBs / OID确实可以在代理上查询。 我想能够做到这一点(在bash脚本中):

 snmp_sanity_checks() { ... if ! err=$($snmpcmd); then echo "ERROR: $err" exit $UNKNOWN fi ... } 

有谁知道这个原因,我怎么能“修复”它?

谢谢

作为另一种解决方法,您可以这样做:

 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 ... }