我正在尝试将 snmptrap 从我的 centos 机器发送到另一台 centos 机器。我在日志中看到以下内容,带有 net-snmp 的 snmptrap V3 不起作用“usm:引擎 ID 不匹配”
trace: sc_hash(): scapi.c, 464:
trace: sc_get_properlength(): scapi.c, 138:
trace: set_enginetime(): lcd_time.c, 393:
lcd_set_enginetime: engineID 7A 7A 7D 80 7A 7A 7A 83 86 89 8C 8F : boots=0, time=0
trace: usm_get_user_from_list(): snmpusm.c, 3527:
usm: match on user doit
trace: usm_get_user_from_list(): snmpusm.c, 3533:
**usm: no match on engineID (7A 7A 7D 80 7A 7A 7A 83 86 89 8C 8F )**
trace: usm_get_user_from_list(): snmpusm.c, 3527:
usm: match on user doit
trace: usm_get_user_from_list(): snmpusm.c, 3533:
我的 snmptrapd.conf 文件如下所示
[root@localhost crash]# cat /etc/snmp/snmptrapd.conf
# Example configuration file for snmptrapd
#
# No traps are handled by default, you must edit this file!
#
# authCommunity log,execute,net public
# traphandle SNMPv2-MIB::coldStart /usr/bin/bin/my_great_script cold
createUser -e 00002E390000005056877fb3 doit MD5 doitpassword DES
authUser log doit AuthNoPriv
我使用了 C 的 net-snmp 模块,下面是创建引擎 ID 的代码块,
char engineID[13];
engineID[0]= "0x00";
engineID[1]= "00";
engineID[2]= "2e";
engineID[3]= "39";
engineID[4]= "00";
engineID[5]= "00";
engineID[6]= "00";
engineID[7]= "50";
engineID[8]= "56";
engineID[9]= "87";
engineID[10]= "7f";
engineID[11]= "b3";
engineID[12]= "\0";
session.securityEngineID = (u_char *)engineID;
session.securityEngineIDLen = 12;
除此之外,我没有对接收陷阱的目标机器进行任何设置。
主要问题是目标机器接收陷阱时显示空白描述。请查看下面的屏幕截图。不确定我在这里做错了什么。请提供建议。
答案1
首先,这不是 C 字符串或字符数组的工作方式。字符[]是字符; 例如,[-128; 127] 范围内的一个数字,或者 [0; 255] 范围内的一个数字,如果它是未签名char。例如,0x41
或'A'
为字符,但"A"
不是——而且"0x41"
是确实不是(粗略地说,这是一个指向 char[5] 的指针)。
第二:“八位字节串”是 ASN.1 术语,表示字节数组(“八位字节”表示 8 位字节),又名unsigned char[]
C 语言。换句话说,它只是表示纯二进制数据。
二进制数据可以用多种方式表示 - 一系列 ASCII 字符,或一系列十六进制数,或单个长十六进制数,...例如,ABC
和0x414243
(带或不带 0x)和{0x41, 0x42, 0x43}
和{'A', 'B', 'C'}
是书写相同数据的不同方式。
因此,如果您有一个十六进制字符串00002E390000005056877fb3
(您知道它是十六进制的,因为 snmpd.conf 手册是这么说的),您可以用 C 语言像这样编写它:
unsigned char engineID[12];
engineID[0] = 0x00;
engineID[1] = 0x00;
engineID[2] = 0x2e;
engineID[3] = 0x39;
...
engineID[11] = 0xb3;
或者像这样:
unsigned char engineID[] = {0x00, 0x00, 0x2e, 0x39, ..., 0xb3};