Сложность с netsnmp: использование snmpget и регистрация ошибок в STDOUT - PullRequest
1 голос
/ 08 мая 2009

На странице справки я вижу следующее:

-L LOGOPTS        Toggle various defaults controlling logging:
              e:           log to standard error
              o:           log to standard output

Это меня очень волнует, потому что я нахожусь в ситуации, когда это будет мне выгодно фиксировать ошибки из STDOUT, а не из STDERR.

Если я запускаю команду:

snmpget -v1 -ccommString  -Lo 172.16.x.x  .1.2.3.4.5.6.7.8.9

Я возвращаюсь в свой терминал

Error in packet
Reason: (noSuchName) There is no such variable name in this MIB.
Failed object: iso.2.3.4.5.6.7.8.9

однако, если я запускаю команду:

snmpget -v1 -ccommString  -Lo 172.16.x.x .1.2.3.4.5.6.7.8.9 2> foo

Я не получаю ответ на терминале, но файл foo содержит то же самое сообщение об ошибке, которое я получил выше. Итак, я получаю сообщение об ошибке на STDERR, а не STDOUT, как я ожидал.

Я неправильно читаю справочную страницу? Дополнительно я попробовал это в системах Linux и Windows, и из-за ситуации, в которой я нахожусь Я бы предпочел, чтобы ошибки выводились на STDOUT, а не на STDERR потому что я не хочу использовать оболочку, чтобы сделать работу с обычным 2> & 1

Любая помощь или предложения с благодарностью.

Ответы [ 2 ]

1 голос
/ 08 мая 2009

Я полагаю, что опция -L контролирует, как агент (snmpd) ведет запись в журнал, и не применяется к сообщениям об ошибках от snmpget (-L является одним из «общих» флагов, он может не применяться ко всем net-snmp). команды). * * +1001

0 голосов
/ 18 июня 2009

Следующий код c является частью источника утилиты snmpget (snmpget.c в net-snmp-5.4.2.1 \ apps).

fprintf(stderr, "Error in packet\nReason: %s\n",
        snmp_errstring(response->errstat));

if (response->errindex != 0) {
    fprintf(stderr, "Failed object: ");
    for (count = 1, vars = response->variables;
            vars && count != response->errindex;
            vars = vars->next_variable, count++)
        /*EMPTY*/;
    if (vars) {
        fprint_objid(stderr, vars->name, vars->name_length);

Как видите, сообщения просто записываются на stderr .

Вы можете использовать пользовательскую утилиту snmpget: Скачать исходный код, заменить stderr на stdout и перекомпилировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...