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

Java 通过snmp获取设备名称和型号,java,networking,snmp,Java,Networking,Snmp,我正在尝试通过snmp获取交换机设备和型号名称。当我尝试使用Nortell或Juniper交换机时,它工作正常,但Cisco交换机会导致问题。我使用这个oid值:“.1.3.6.1.2.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 sta

我正在尝试通过snmp获取交换机设备和型号名称。当我尝试使用Nortell或Juniper交换机时,它工作正常,但Cisco交换机会导致问题。我使用这个oid值:“.1.3.6.1.2.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();
    }
}

无法保证此
.1.3.6.1.2.1.1.1.0
将为您提供所需的名称。在进行查询之前,请查看此型号的Cisco手册,以查看是否有方法进行配置

无法保证此
.1.3.6.1.2.1.1.1.0
将提供您想要的名称。在进行查询之前,请查看此型号的Cisco手册,以查看是否有方法进行配置

给定oid不必执行您期望的操作。您必须从手册中学习正确的oid

给定的oid不能做您期望的事情。您必须从手册中学习正确的oid,因为您遇到了关于
oid
的问题,并且
希望通过snmp获取设备名称和型号,那么我希望您检查您的网络中有哪些可用的oid。然后你可以选择

您可以使用Nmap命令,如下所示

nmap -sU -p161 --script snmp-brute --script-args snmplist=community.lst 10.20.X.XX/24
另一方面 您可以使用,它生成一个XML文件,其中包含启用snmp的设备及其各自的社区。 此脚本还接受IP地址和多个社区名称作为输入文件

资源链接:

  • 由于您在
    oid
    方面遇到问题,并且
    希望通过snmp获取设备名称和型号,因此我希望您检查网络中的可用设备。然后你可以选择

    您可以使用Nmap命令,如下所示

    nmap -sU -p161 --script snmp-brute --script-args snmplist=community.lst 10.20.X.XX/24
    
    另一方面 您可以使用,它生成一个XML文件,其中包含启用snmp的设备及其各自的社区。 此脚本还接受IP地址和多个社区名称作为输入文件

    资源链接:

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

    例如:

    $tcpdump udp和端口161

    tcpdump:抑制详细输出,使用-v或-vv进行完整协议解码
    在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-在sysDescr.0上
    .1.3.6.1.2.1.1.1.0

    不太可能给出设备名称或确切型号

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

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

    sysObjectID.0上的$snmptranslate-IR .1.3.6.1.2.1.1.2.0

    $snmpget-v1-c公共rtr系统对象ID.0
    SNMPv2 MIB::sysObjectID.0=OID:SNMPv2 SMI::enterprises.9.1.469


    您可以在
    CISCO-PRODUCTS-MIB

    中通过查找对响应进行解码。我建议您首先确保确实从交换机获得snmp响应。我怀疑交换机上的snmp没有完全配置,您的代码得到的是超时而不是snmp响应

    例如:

    $tcpdump udp和端口161

    tcpdump:抑制详细输出,使用-v或-vv进行完整协议解码
    在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-在sysDescr.0上
    .1.3.6.1.2.1.1.1.0

    不太可能给出设备名称或确切型号

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

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

    sysObjectID.0上的$snmptranslate-IR .1.3.6.1.2.1.1.2.0

    $snmpget-v1-c公共rtr系统对象ID.0
    SNMPv2 MIB::sysObjectID.0=OID:SNMPv2 SMI::enterprises.9.1.469


    您可以在
    CISCO-PRODUCTS-MIB
    @PeerNet中通过查找来解码响应。我执行了您的代码,唯一的更改是在OID中添加了一个“0”,即“.1.3.6.1.2.1.1.0”

    尝试Paessler SNMP Tester,它将为您提供交换机上的所有OID,因此您可以在代码中使用这些OID

    你可以试试我在上面找到的代码


    @PeerNet我执行了您的代码,唯一的更改是在OID中添加了一个“0”,即“.1.3.6.1.2.1.1.1.0”

    试试派斯勒