在阅读了 SNMP 和一些问题后,我认为将代理角色理解为设备的 SNMP 服务(像 SQL 一样,它是存储的 API)。
当您执行 SQL 查询时,SQL 引擎会完成所有工作并返回结果——您无需了解存储方式和存储位置。
但是 MIB 不是实际存储,那么我的代理的作用是什么?
如果代理仅像我在本教程中所遵循的那样注册 MIB ,那么它根本不用作处理程序,这意味着有一个 pyhiscal 存储,您可以设置并到达那里而无需绕过处理程序。在本教程中,您可以这样做:
netsnmp_register_int_instance("my example int variable",
my_registration_oid,
OID_LENGTH(my_registration_oid),
&example1, NULL);
无需在处理程序中处理调用。
假设我想监控我的应用程序的待处理请求队列,所以我想要一个代理,它会为它触发所有 application_pending_request 的 SNMP 请求,它会返回队列深度。当我需要轮询我的应用程序队列以获得结果时,为什么我需要有一个实际的 MIB?
您对 SNMP 的工作原理存在根本性的误解。快速粗略的比较:SNMP MIB 就像主机名。MIB 将 OID 映射到一个友好的名称——例如
.1.3.6.1.2.1.1.1.0
=>SNMPv2-MIB::sysDescr.0
=>Host Description
(uname 输出)。为了从 SNMP 服务器(代理)检索信息,该信息必须在特定的 OID 上发布。
为了让 SNMP 守护进程发布信息,它(通常)需要两件事:
(一些 SNMP 守护进程可能还需要映射 OID 的 MIB 文件)
为了检索信息,您必须知道 OID - 这可以是数字 OID 或SNMP 客户端上 MIB 文件中的“友好”名称。
SNMP“浏览器”通常需要一个 MIB 文件,因为如果没有 MIB 文件,它们所能呈现给您的只是一个无意义的数字列表。
所以你的问题的答案是“你不需要MIB文件,它们只是对需要与 SNMP 交互的人有帮助”。
以您的示例(报告队列长度)为例,这听起来像是您喜欢使用的教程
net-snmp
(UCD-SNMP)。net-snmp
包括用于此类事情的内置工具——通读手册页和示例配置文件(特别注意exec
运行外部脚本的指令:通常你会运行一个打印队列长度的脚本,并在您的监控软件/SNMP 客户端)