使用netsnmp时遇到困难:使用snmpget并将错误记录到STDOUT

时间:2009-05-08 16:52:28

标签: networking snmp

在手册页中,我看到以下内容:

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

这让我非常兴奋,因为我处于这样的境地 有利于我从STDOUT而不是从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上发出错误 因为我不想用shell来平常做的工作 2 - ;&安培; 1

非常感谢任何帮助或建议。

2 个答案:

答案 0 :(得分:1)

我相信-L选项控制代理(snmpd)如何进行日志记录,并且不适用于来自snmpget的错误消息(-L是“常见”标志之一,它可能不适用于所有net-snmp命令)。

答案 1 :(得分:0)

以下c代码是snmpget实用程序源代码的一部分(net-snmp-5.4.2.1 \ apps中的snmpget.c)。

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实用程序:Download源代码,将 stderr 替换为 stdout ,然后重新编译。