首页 > 解决方案 > Snmpwalk 随机返回更少的变量(以 SNMPv2-MIB::snmpSetSerialNo.0 结尾)

问题描述

我正在创建新的 MiB,其中包括对象 groupProcessInfo,该任务是返回 X 应用程序进程的状态,其中 X 替换为应用程序的名称。

MiB 中的每个进程定义如下:

appXState OBJECT-TYPE
        SYNTAX          OCTET STRING (SIZE(0..255))
        MAX-ACCESS      read-only
        STATUS          current
        DESCRIPTION     "X service"
        ::= { groupProcessInfo 10 1 }
appXMemUsage OBJECT-TYPE
        SYNTAX          Integer32
        MAX-ACCESS      read-only
        STATUS          current
        DESCRIPTION     "X service"
        ::= { groupProcessInfo 10 2 }

并分配给对象:

groupProcessInfo OBJECT IDENTIFIER ::= { myMIB 1 }

有一个主 bash 脚本,它使用实用程序或其他 bash 脚本找出进程的状态,这些脚本需要不同的时间,所以当 snmpwalk 或 snmpget 时,我需要指定更大的超时 (-t)。

使用以下命令将主 bash 脚本传递给 snmpd.conf:

pass .1.3.6.1.4.1.x.y.3.10 /etc/snmp/scripts/process.sh

当我尝试使用 snmpget 或 snmpgetnext 获取 appXState 或 appXMemUsage 的值时,它可以工作并且总是返回正确的值,但 snmpwalk 不能按预期工作。

当我运行这个命令时:

$ snmpwalk -Cp -Ct -v 2c -t 20 -m +MY-MIB -c testing localhost groupProcessInfo

它有时会返回更少的变量,而遍历时间显着减少。

笔记:

1. Snmpwalk 跟踪模式

当这种情况发生在跟踪模式 (-D all) 中时,snmpagent 作为最后一个变量返回SNMPv2-MIB::snmpSetSerialNo.0,它不在 OID 树中。当树中的所有变量都正确返回时,这不会在运行中发生。

跟踪模式输出:

trace: snmp_comstr_parse(): snmp_auth.c, 130:
dumph_recv:   SNMP version
dumpx_recv:    02 01 01
dumpv_recv:      Integer:       1 (0x01)
trace: snmp_comstr_parse(): snmp_auth.c, 142:
dumph_recv:   community string
dumpx_recv:    04 07 74 65 73 74 69 6E 67
dumpv_recv:      String:        testing
trace: _snmp_parse(): snmp_api.c, 4142:
dumph_recv:   PDU
trace: snmp_pdu_parse(): snmp_api.c, 4362:
dumpv_recv:     Command RESPONSE
trace: snmp_pdu_parse(): snmp_api.c, 4447:
dumph_recv:     request_id
dumpx_recv:      02 04 0E 5E DD 9C
dumpv_recv:        Integer:     241098140 (0xE5EDD9C)
trace: snmp_pdu_parse(): snmp_api.c, 4458:
dumph_recv:     error status
dumpx_recv:      02 01 00
dumpv_recv:        Integer:     0 (0x00)
trace: snmp_pdu_parse(): snmp_api.c, 4469:
dumph_recv:     error index
dumpx_recv:      02 01 00
dumpv_recv:        Integer:     0 (0x00)
trace: snmp_pdu_parse(): snmp_api.c, 4487:
dumph_recv:     VarBindList
trace: snmp_pdu_parse(): snmp_api.c, 4503:
dumph_recv:       VarBind
trace: snmp_parse_var_op(): snmp.c, 164:
dumph_recv:         Name
dumpx_recv:          06 0A 2B 06 01 06 03 01 01 06 01 00
dumpv_recv:            ObjID: SNMPv2-MIB::snmpSetSerialNo.0
trace: snmp_pdu_parse(): snmp_api.c, 4512:
dumph_recv:         Value
dumpx_recv:          02 04 12 55 CB EF
dumpv_recv:            Integer: 307612655 (0x1255CBEF)
trace: _sess_process_packet(): snmp_api.c, 5244:
sess_process_packet: received message id#0 reqid#241098140 len 50
trace: snmp_synch_input(): snmp_client.c, 183:
snmp_synch: Response (ReqID: 241098140 - Cmd 162)
Variables found: 11
Total traversal time = 7.302387 seconds

2.strace snmpwalk

当使用 strace 实用程序运行上述命令时,当返回的变量较少时,它就像返回所有变量并且脚本结束时没有错误一样。

exit_group(0)                           = ?
+++ exited with 0 +++

谢谢你的提示。

标签: snmpmibsnmpd

解决方案


我设法仅使用一个默认公共社区、一个用户和一个组来解决问题。该组只能访问一个具有多个 OID 子树定义的视图:

com2sec notConfigUser    default          public

社区仅在 com2sec 线路上定义,但在其他任何地方都没有。

view    all           included   .1.3.6.1.4.1.x.y
view    all           included   .1.3.6.1.4.1.2021
view    all           included   .1                         80
view    systemview    included   .1.3.6.1.2.1.1
view    systemview    included   .1.3.6.1.2.1.25.1.1
view    systemview    included   .1.3.6.1.4.1

定义了多个子树的一个视图,但没有比“all”和“systemview”更多的视图。

access  notConfigGroup ""      any       noauth    exact  all none none

notConfigGroup 有权访问“全部”视图。


推荐阅读