1

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

-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 上发出错误,因为我不想使用 shell 来完成通常的工作 2 >&1

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

4

2 回答 2

1

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

于 2009-05-08T17:16:06.437 回答
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 实用程序:下载源代码,将stderr替换为stdout ,然后重新编译。

于 2009-06-18T07:54:20.757 回答