Почему 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
...
}
Кто-нибудь знает причину этого и как я могу это «исправить»?
Спасибо
В качестве другого обходного пути вы можете сделать следующее:
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
...
}