如何通过get,getnext,set,trap几种操作访问mib对象的值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过get,getnext,set,trap几种操作访问mib对象的值相关的知识,希望对你有一定的参考价值。
Snmputil是一个命令行下的软件,使用语法如下: usage: snmputil get|getnext|walk] agent community oid [oid ...] snmputil trap其中agent表示代理进程的IP地址,community表示团体名,oid表示MIB对象ID。
举例说明:
1)查看本地计算机(IP地址为192.168.0.176)的系统信息
通过对系统组的MIB对象的查阅,我们知道系统信息所对应的MIB对象为.1.3.6.1.2.1.1.1(参看系统组对象),我们使用get参数来查询:
C:>snmputil get 192.168.0.176 public .1.3.6.1.2.1.1.1.0 Variable = system.sysDescr.0
Value = String Hardware: x86 Family 15 Model 2 Stepping 7 AT/AT COMPATIBLE -
Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)
其中public是192.168.0.3计算机上的团体名,.1.3.6.1.2.1.1.1.0是对象实例,注意对象ID前面要加一个点".",后面还要加一个"0"。如果不在对象ID末尾加上一个0,那么用get参数查询就会出错。从查询结果中我们能够看出操作系统版本和CPU类型。
2)查询计算机连续开机多长时间
C:>snmputil get 192.168.0.176 public .1.3.6.1.2.1.1.3.0
Variable = system.sysUpTime.0
Value = TimeTicks 447614
如果我们在对象ID后面不加0,使用getnext参数能得到同样的效果:
C:>snmputil getnext 192.168.0.176 public .1.3.6.1.2.1.1.3
Variable = system.sysUpTime.0
Value = TimeTicks 476123
3)查询计算机的联系人
C:>snmputil get 192.168.0.176 public .1.3.6.1.2.1.1.4.0
Variable = system.sysContact.0
Value = String administrator
以上简单介绍了用snmputil查询代理进程的方法,由于在命令行下使用,可能大家感到颇为不方便,但命令行的一个好处就是可以促进大家主动查阅MIB对象,加深对SNMP网络管理的认识。
4)使用walk查询设备上所有正在运行的进程:
C:>snmputil walk 192.168.0.176 public .1.3.6.1.2.1.25.4.2.1.2 Variable = host.hrSWRun.hrSWRunTable.hrSWRunEntry. hrSWRunName.1 Value = String System Idle Process
Variable = host.hrSWRun.hrSWRunTable.hrSWRunEntry. hrSWRunName.4 Value = String System
Variable = host.hrSWRun.hrSWRunTable.hrSWRunEntry. hrSWRunName.292
- 1 -
snmputil使用方法
SWRun.hrSWRunTable.hrSWRunEntry. hrSWRunName.308 Value = String RavTimer.exe
Variable = host.hrSWRun.hrSWRunTable.hrSWRunEntry. hrSWRunName.336 Value = String RavMon.exe
限于篇幅笔者就不把所有进程列出来,大家可以在自己的计算机上面实验,以加强感性认识。
5)查询计算机上面的用户列表
C:>snmputil walk 192.168.0.176 public .1.3.6.1.4.1.77.1.2.25.1.1
Variable = .iso.org.dod.internet.private.enterprises. lanmanager.lanmgr-2.server. svUserTable.svUserEntry.svUserName.4.117.115.101.114
Value = String user
Variable = .iso.org.dod.internet.private.enterprises. lanmanager.lanmgr-2.server. svUserTable.svUserEntry.svUserName.5.71.117.101.115.116
Value = String Guest
Variable = .iso.org.dod.internet.private.enterprises. lanmanager.lanmgr-2.server.svUserTable.svUserEntry. svUserName.13.65.100.109.105.110. 105.115.116.114.97.116.111.114
Value = String Administrator
从中我们可以得知该计算机共有三个用户,它们分别为user、guest和administrator。
Snmputil还有一个trap的参数,主要用来陷阱捕捉,它可以接受代理进程上主动发来的信息。如果我们在命令行下面输入snmputil trap后回车,然后用错误的团体名来访问代理进程,这时候就能收到代理进程主动发回的报告。
在MIBII中总共有175个对象,每个对象均有其不同的含义,我们只有通过查阅MIB才能知道它们各自的作用。MIB对象是SNMP网络管理中的核心内容,只有深入了解MIB对象的含义我们才有可能知道如何去驾驭SNMP网络管理。 参考技术A 通过snmp命令获取本回答被提问者采纳
如何解码监听端口 162(Snmp Trap)的结果?
【中文标题】如何解码监听端口 162(Snmp Trap)的结果?【英文标题】:how to decode the result of listenning to port 162 (Snmp Trap)? 【发布时间】:2016-07-20 14:38:00 【问题描述】:我想通过使用我自己的陷阱侦听器来获取 snmp 陷阱。事实上,我使用了在互联网上找到的代码,我添加了一些修改,现在它正在工作。我可以通过 162 端口监听。
#include "stdio.h"
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
#define SNMP_TRAP_PORT 162
#define MAX_MSG 400
static void init(void)
WSADATA wsa;
int err = WSAStartup(MAKEWORD(2, 2), &wsa);
if(err < 0)
puts("WSAStartup failed !");
exit(EXIT_FAILURE);
static void end(void)
WSACleanup();
int main(int argc, char *argv[])
int sd, rc, n, cliLen;
struct sockaddr_in cliAddr, servAddr;
char msg[MAX_MSG];
/* socket creation */
init();
sd= socket(AF_INET, SOCK_DGRAM, 0);
if(sd<0)
printf("can't open socket \n");
exit(1);
/* bind local server port */
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(SNMP_TRAP_PORT);
rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr));
if(rc<0)
printf("can't bind port number %d \n", SNMP_TRAP_PORT);
exit(1);
printf("waiting for SNMP Traps on UDP port %d\n", SNMP_TRAP_PORT);
/* server infinite loop */
while(1)
/* init buffer */
memset(msg,0x0,MAX_MSG);
/* receive message */
cliLen = sizeof(cliAddr);
n = recvfrom(sd, msg, MAX_MSG, 0, (struct sockaddr *) &cliAddr, &cliLen);
if(n<0)
printf("%s: cannot receive data \n",argv[0]);
continue;
/*message is encoded with ASN1 and should be decoded*/
/* print received message */
printf("SNMP Trap received from %s : %o\n", inet_ntoa(cliAddr.sin_addr),msg);
/* end of server infinite loop */
end();
return 0;
当我收到一个数字时,代码现在可以正常工作了。通常,我应该在 ASN1(十六进制或二进制)中获取陷阱,但我得到的是:Traplistner result。 我想知道 12175440 是什么意思。 谢谢
【问题讨论】:
【参考方案1】:简答;是八进制写的msg
的内存地址。
如果您在具有 32 位 int
和 64 位指针的 little-endian 机器上运行此代码,则很可能是 msg
地址的低 32 位。
这是由于两个方面的结合:
printf
格式说明符 %o
将参数数据中的下一个字节解释为整数并以八进制打印。
将数组作为参数传递给函数被转换为传递指向第一个元素的指针。所以这些语句是等价的:
printf("%p\n", msg);
printf("%p\n", &msg[0]);
要实际打印您收到的数据,请添加以下内容:
for (int i = 0; i < n; ++i)
printf("%02x ", (unsigned char)msg[i]);
printf("\n");
【讨论】:
你好,我想谢谢你。这是工作 。现在我得到的是数字板凳。我想我收到了 ASN.1 消息。我想我必须在脚本中解码消息。以上是关于如何通过get,getnext,set,trap几种操作访问mib对象的值的主要内容,如果未能解决你的问题,请参考以下文章