当前位置: 首页 > 知识库问答 >
问题:

无需SNMP代理即可扫描IP

巫新知
2023-03-14

使用以下代码作为示例https://www.jitendrazaa.com/blog/java/snmp/create-snmp-client-in-java-using-snmp4j/当我将OID发送到空IP或没有SNMP的设备时,要监视网络,程序会引发异常。

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

该程序属于java的GetAsString方法。lang.NullPointerException

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个答案

文华美
2023-03-14

使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"
    }
}

没有目标,这就是空指针异常的原因

 类似资料:
  • 我已使用snmp4j api在SNMP代理上创建,但SNMP表注册存在问题 一旦我注册了表和表中的行。然后,如果我在表中设置值,所有行都会设置相同的值。我已经从JSON创建了snmp表 如果我设置了值,请在下表中 .1.3.6.1.4.1.1.201.6.2。它为下表中注册的所有行设置值。是否有人知道如何使用snmmpj代理正确注册和设置值。

  • 有没有更惯用的方式来编写对map的重复调用(不使用flatMap)? 请参阅以下示例: 这是一个正在运行的函数,在这种情况下需要返回未来的[结果]。 我尝试过使用“理解”,但没有找到平面图的应用程序。我尝试使用flatMap的结果是我没有未来。

  • 问题内容: 我想有一个不连接数据库就表现为mysql_real_escape_string的功能,因为有时我需要在没有数据库连接的情况下进行干式测试。mysql_escape_string已被弃用,因此是不可取的。我的一些发现: http://www.gamedev.net/community/forums/topic.asp?topic_id=448909 http://w3schools.in

  • 我是SNMP新手,谢谢你的支持......我有一个子代理的现有Perl脚本,在尝试运行它时出现了以下问题:代理似乎连接到“默认”snmpd deamon,该deamon被配置为主代理(“master agentx”行存在于snmpd.conf中)。此时,脚本将一些值分配给我的MIB中的对象。但是,当我然后在master-agent上执行snmpwalk或snmpget时,我得到(对于v1查询)“结

  • 问题内容: 我开始创建我的管道多分支环境,但是我遇到了一个问题。 我是否可以仅通过Jenkinsfile运行构建扫描以检测分支,而无需执行管道? 我的项目有不同的分支,当我从父管道多分支启动构建扫描时,我不想要所有带有Jenkinsfile的分支的所有子管道。 感谢您的帮助! 问题答案: 在“ 分支源” 部分,您可以添加一个名为“抑制自动SCM触发”的属性。 这样可以防止Jenkins使用。

  • 我正在尝试使用snmp4j模拟SNMP代理。我正在向代理注册MOs。下面是代码段: 当启动代理时,我得到了DuplicateInstrationException。请指导我如何注册类。请提供方向。