如何通过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对象的值的主要内容,如果未能解决你的问题,请参考以下文章

SNMP信息泄露漏洞

SNMP GetNext接口规范

Dell iDRAC sending trap mail settings rac0225

求教linux下如何配置snmp trap

如何从多个 Set 语句中选择值

刷题42. Trapping Rain Water