gpt4 book ai didi

java - 通过snmp获取设备名称和型号

转载 作者:行者123 更新时间:2023-11-29 06:30:13 24 4
gpt4 key购买 nike

我正在尝试通过 snmp 获取交换机设备和型号名称。当我尝试获得 Nortell 或 Juniper 交换机时,它工作正常,但 Cisco 交换机会导致问题。我使用这个 oid 值:“.1.3.6.1.2.1.1.1.0”,但我也尝试了“1.3.6.1.2.1.1.1”。并且返回值为空。这是我的代码:

package list;

public class DeviceInfo {
private static String ipAddress = "10.20.X.XX";

private static String port = "161";

private static String oidValue = ".1.3.6.1.2.1.1.1";

private static int snmpVersion = SnmpConstants.version1; // or version2c

private static String community = "myreadcommunity";

public static void main(String[] args) throws Exception {

TransportMapping transport = new DefaultUdpTransportMapping();
transport.listen();

CommunityTarget comtarget = new CommunityTarget();
comtarget.setCommunity(new OctetString(community));
comtarget.setVersion(snmpVersion);
comtarget.setAddress(new UdpAddress(ipAddress + "/" + port));
comtarget.setRetries(2);
comtarget.setTimeout(1000);

PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID(oidValue)));
pdu.setType(PDU.GET);
pdu.setRequestID(new Integer32(1));

Snmp snmp = new Snmp(transport);

System.out.println("Sending request.");
ResponseEvent response = snmp.get(pdu, comtarget);

if (response != null) {

System.out.println("Got results.");
PDU responsePDU = response.getResponse();

if (responsePDU != null) {
int errorStatus = responsePDU.getErrorStatus();
int errorIndex = responsePDU.getErrorIndex();
String errorStatusText = responsePDU.getErrorStatusText();

if (errorStatus == PDU.noError) {
System.out.println("Switch Name: = " + responsePDU.getVariableBindings());
System.out.println(responsePDU.size());
} else {
System.out.println("Error");
System.out.println("Error code: " + errorStatus);
System.out.println("Error Name: " + errorStatusText);
}
} else {
System.out.println("NULL");
}
} else {
System.out.println("Error: Timeout ");
}
snmp.close();
}
}

最佳答案

我建议首先确保您确实从交换机获得 snmp 响应。我怀疑 snmp 没有在交换机上完全配置,并且您的代码超时而不是 snmp 响应。

例子:

$ tcpdump udp 和端口 161

tcpdump:详细输出被抑制,使用 -v 或 -vv 进行完整协议(protocol)解码
监听 eth0,链路类型 EN10MB(以太网),捕获大小 262144 字节
10:36:26.980138 IP host.example.com.41226 > rtr.example.com.snmp: GetRequest(28) system.sysName.0
10:36:26.983971 IP rtr.example.com.snmp > host.example.com.41226: GetResponse(43) system.sysName.0="rtr.example.com"

由于您正在执行 snmp GET 请求,因此您的 oid 必须以“.0”结尾。响应oid sysName.0返回设备名

$ snmptranslate -IR -On sysName.0
.1.3.6.1.2.1.1.5.0

例子:

$ snmpget -v1 -c public rtr sysName.0
SNMPv2-MIB::sysName.0 = STRING: rtr.example.com

您正在使用的 oid:

$ snmptranslate -IR -On sysDescr.0
.1.3.6.1.2.1.1.1.0

不太可能提供设备名称甚至确切型号。

$ snmpget -v1 -c public rtr sysDescr.0
SNMPv2-MIB::sysDescr.0 = STRING: 思科互联网操作系统软件
IOS (tm) C2600 软件 (C2600-IPBASE-M),版本 12.3(6c),发布软件 (fc1)
版权所有 (c) 1986-2004 思科系统公司。
由 kellythw 于 2004 年 7 月 20 日星期二 05:24 编译

可以使用 sysObjectID 请求设备型号:

$ snmptranslate -IR -On sysObjectID.0
.1.3.6.1.2.1.1.2.0

$ snmpget -v1 -c public rtr sysObjectID.0
SNMPv2-MIB::sysObjectID.0 = OID:SNMPv2-SMI::enterprises.9.1.469

您可以通过在 CISCO-PRODUCTS-MIB 中查找来解码响应

关于java - 通过snmp获取设备名称和型号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36645080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com