在没有SNMP代理的情况下扫描IP

时间:2019-02-13 10:42:01

标签: java snmp snmp4j

https://www.jitendrazaa.com/blog/java/snmp/create-snmp-client-in-java-using-snmp4j/中的以下代码为例,当我将OID发送到空IP或没有SNMP的设备时,该程序将引发异常。

我使用for循环读取IP。我试图以不同的方式改变执行流程,但没有成功。

该程序通过java.lang.NullPointerException属于getAsStrint方法

public class SNMPManager {

Snmp snmp = null;
String address = null;

/**
 * Constructor
 *
 * @param add
 */
public SNMPManager(String add) {
    address = add;
}

public static void main(String[] args) throws IOException {
/**
* Port 161 is used for Read and Other operations
* Port 162 is used for the trap generation
*/


    for (int i = 37; i < 40; i++) {

        System.out.println("ip x.x.x." + i);
        SNMPManager client = new SNMPManager("udp:192.168.1." + i + "/161");
        //SNMPManager client = new SNMPManager("udp:192.168.1.37/161");
        client.start();
        /**
        * OID - .1.3.6.1.2.1.1.1.0 => SysDec
        * OID - .1.3.6.1.2.1.1.5.0 => SysName
        * => MIB explorer will be usefull here, as discussed in previous article
        */

        String sysDescr = client.getAsString(new OID(".1.3.6.1.2.1.1.5.0"));
        System.out.println(".1.3.6.1.2.1.1.5.0" + " - SysName: " + sysDescr);

        String sysDescr2 = client.getAsString(new OID(".1.3.6.1.2.1.1.1.0"));
        System.out.println(".1.3.6.1.2.1.1.1.0" + " - SysDec: " + sysDescr2);
    }
}

/**
 * Start the Snmp session. If you forget the listen() method you will not
 * get any answers because the communication is asynchronous
 * and the listen() method listens for answers.
 *
 * @throws IOException
 */
private void start() throws IOException {
    TransportMapping transport = new DefaultUdpTransportMapping();
    snmp = new Snmp(transport);
// Do not forget this line!
    transport.listen();
}

/**
 * Method which takes a single OID and returns the response from the agent as a String.
 *
 * @param oid
 * @return
 * @throws IOException
 */
public String getAsString(OID oid) throws IOException {
    ResponseEvent event = get(new OID[]{oid});
    return event.getResponse().get(0).getVariable().toString();
}

/**
 * This method is capable of handling multiple OIDs
 *
 * @param oids
 * @return
 * @throws IOException
 */
public ResponseEvent get(OID oids[]) throws IOException {
    PDU pdu = new PDU();
    for (OID oid : oids) {
        pdu.add(new VariableBinding(oid));
    }
    pdu.setType(PDU.GET);
    ResponseEvent event = snmp.send(pdu, getTarget(), null);
    if (event != null) {
        return event;
    }
    throw new RuntimeException("GET timed out");
}

/**
 * This method returns a Target, which contains information about
 * where the data should be fetched and how.
 *
 * @return
 */
private Target getTarget() {
    Address targetAddress = GenericAddress.parse(address);
    CommunityTarget target = new CommunityTarget();
    target.setCommunity(new OctetString("public"));
    target.setAddress(targetAddress);
    target.setRetries(2);
    target.setTimeout(1500);
    target.setVersion(SnmpConstants.version2c);
    return target;
}

1 个答案:

答案 0 :(得分:1)

使getAsString(OID oid)这样的方法

public String getAsString(OID oid) throws IOException {
    ResponseEvent event = get(new OID[]{oid});
    if(event.getResponse() != null){
        return event.getResponse().get(0).getVariable().toString();
    } else {
        return "no target"
    }
}

没有目标,这就是为什么空指针异常