ping或扫描端口的Java工具类

jopen 9年前

包含了ping和端口扫描工具。可以按网段及端口段扫描,详见测试。

import java.io.BufferedReader;  import java.io.IOException;  import java.io.InputStreamReader;  import java.io.PrintStream;  import java.net.InetSocketAddress;  import java.net.Socket;  import java.util.ArrayList;  import java.util.HashMap;  import java.util.LinkedHashMap;  import java.util.List;  import java.util.Map;      public class Discovery {    PrintStream out = null;         public Discovery(){       }        public Discovery(PrintStream out){     this.out = out;    }      /**    * 对指定的ip(数组)进行ping探测    *     * @param ips ip数组           * @return 返回格式为 ip:是否成功    */   public LinkedHashMap<String, Boolean> ping(List<String> ips) {    LinkedHashMap<String, Boolean> ret = new LinkedHashMap<String, Boolean>();    Map<String, String> args = new HashMap<String, String>();    BufferedReader br = null;    for (String ip : ips) {     args.put("ip", ip);     String value = SystoolkitConfigure.getValue("ping.command", args);     // 获得JVM的运行环境  //   Runtime r = Runtime.getRuntime();     // 创建一个ping命令进程     try {      Process p = Runtime.getRuntime().exec(value);      StringBuilder sb = new StringBuilder();      String line = null;            br = new BufferedReader(new InputStreamReader(        p.getInputStream()));              while ((line = br.readLine()) != null) {       sb.append(line.trim());       sb.append('\n');      }      br.close();            br = new BufferedReader(new InputStreamReader(        p.getErrorStream()));              while ((line = br.readLine()) != null) {       sb.append(line.trim());       sb.append('\n');      }      br.close();            String os = SystoolkitConfigure.getOS().toLowerCase();      if (-1 != os.indexOf("windows")) {            int index = sb.toString().indexOf("Packets: Sent = 1, Received = 1,");       ret.put(ip, index != -1);       if(null!=out) {        out.println(ip+":"+(index != -1));        out.flush();       }      } else if (-1 != os.indexOf("linux")) {       int index = sb.toString().indexOf("1 packets transmitted, 1 received");       ret.put(ip, index != -1);       if(null!=out) {        out.println(ip+":"+(index != -1));        out.flush();       }      }     } catch (IOException e) {      // TODO Auto-generated catch block  //    e.printStackTrace();     }     }      return ret;   }     /**    * 对指定网段的指定ip范围的机器,进行ping探测    *     * @param networkSection    *            网段,例:192.168.2    * @param startIp    *            开始ip,包含此ip,值>0    * @param endIp    *            结束ip,包含此ip,值<255    * @return ping探测结果    */   public LinkedHashMap<String, Boolean> ping(String networkSection,     int startIp, int endIp) {    List<String> ips = new ArrayList<String>();    if (startIp <= 0 || endIp >= 255) {     throw new IllegalArgumentException("startIp<=0 or endIp>=255.");    }    for (int i = startIp; i <= endIp; i++) {     // ips.add(String.format("%s.%d", networkSection,i));     ips.add(networkSection + "." + i);    }    return ping(ips);   }     /**    * 此方法相当于ping(networkSection,1,254)    *     * @param networkSection    * @return    */   public LinkedHashMap<String, Boolean> ping(String networkSection) {    return ping(networkSection, 1, 254);   }    // public LinkedHashMap<String, Boolean> scanPort(String networkSection,  //   int startIp, int endIp, String port) {  //  // throw new RuntimeException();  //  LinkedHashMap<String, Boolean> ret = new LinkedHashMap<String, Boolean>();  //  List<Integer> ports = new ArrayList<Integer>();  //  List<String> ips = new ArrayList<String>();  //  if (startIp <= 0 || endIp >= 255) {  //   throw new IllegalArgumentException("startIp<=0 or endIp>=255.");  //  }  //  for (int i = startIp; i <= endIp; i++) {  //   ips.add(networkSection + "." + i);  //  }  //  String[] ss = port.split(",");  //  for (String s : ss) {  //   if (-1 != s.indexOf('-')) {  //    String[] range = s.split("-");  //    for (int i = Integer.parseInt(range[0]), end = Integer  //      .parseInt(range[1]); i <= end; i++) {  //     ports.add(i);  //    }  //   } else {  //    ports.add(Integer.parseInt(s));  //   }  //  }  //  Socket client = null;  //  for (String ip : ips) {  //   for (Integer p : ports) {  //    try {  //     client = new Socket();  //     client.connect(new InetSocketAddress(ip, p), 300);  //     ret.put(ip, true);  //    } catch (Exception ex) {  //     ret.put(ip, false);  //    } finally {  //     try {  //      if (null != client)  //       client.close();  //     } catch (Exception ex) {  //     }  //    }  //   }  //     //  }  //  return ret;  // }    // public void scanPort(List<String> ips, String port, PrintStream out) {  //  List<Integer> ports = new ArrayList<Integer>();  //  //  String[] ss = port.split(",");  //  for (String s : ss) {  //   if (-1 != s.indexOf('-')) {  //    String[] range = s.split("-");  //    for (int i = Integer.parseInt(range[0]), end = Integer  //      .parseInt(range[1]); i <= end; i++) {  //     ports.add(i);  //    }  //   } else {  //    ports.add(Integer.parseInt(s));  //   }  //  }  //  //  Socket client = null;  //  for (String ip : ips) {  //   for (Integer p : ports) {  //    try {  //     client = new Socket();  //     client.connect(new InetSocketAddress(ip, p), 300);  //     // ret.add(ip+":"+p);  //     out.println(ip + ":" + p);  //     out.flush();  //    } catch (Exception ex) {  //    } finally {  //     try {  //      if (null != client)  //       client.close();  //     } catch (Exception ex) {  //     }  //    }  //   }  //  }  //  //  out.close();  // }      public List<String> scanPort(String networkSection,     int startIp, int endIp, String port) {    List<String> ips = new ArrayList<String>();        if (startIp <= 0 || endIp >= 255) {     throw new IllegalArgumentException("startIp<=0 or endIp>=255.");    }    for (int i = startIp; i <= endIp; i++) {     ips.add(networkSection + "." + i);    }       return scanPort(ips,port);   }     public List<String> scanPort(List<String> ips, String port) {    List<String> ret = new ArrayList<String>();    List<Integer> ports = new ArrayList<Integer>();      String[] ss = port.split(",");    for (String s : ss) {     if (-1 != s.indexOf('-')) {      String[] range = s.split("-");      for (int i = Integer.parseInt(range[0]), end = Integer        .parseInt(range[1]); i <= end; i++) {       ports.add(i);      }     } else {      ports.add(Integer.parseInt(s));     }    }      Socket client = null;    for (String ip : ips) {     for (Integer p : ports) {      try {       client = new Socket();       client.connect(new InetSocketAddress(ip, p), 300);         ret.add(ip + ":" + p);              if(null!=out){        out.println(ip + ":" + p);        out.flush();       }      } catch (Exception ex) {  //     System.out.println(ex.getMessage());      } finally {       try {        if (null != client)         client.close();       } catch (Exception ex) {       }      }     }      }      return ret;   }  }

 

配置扫描

import java.util.Enumeration;  import java.util.Map;  import java.util.Properties;  import java.util.ResourceBundle;  import java.util.Set;  import java.util.concurrent.ExecutorService;    /**   *    * @author shanl   *   */  public class SystoolkitConfigure implements Runnable{   private static final String default_configure = "systoolkit_default";   private static String user_configure = "systoolkit";   //private int scanInterval = 1000*60*5;   private int scanInterval = 1000*5;   private static Properties config = new Properties();   boolean isService = false;         /**    * 使用默认文件名的配置文件    */   public SystoolkitConfigure(){     }      /**    *     * @param userConfig 用户自定义配置文件    */   public SystoolkitConfigure(String userConfig){    user_configure = userConfig;   }       public void run() {    ResourceBundle confRes = ResourceBundle.getBundle(default_configure);    Enumeration<String> keys = confRes.getKeys();    while(keys.hasMoreElements()){     String key = keys.nextElement();     String value = confRes.getString(key);     if(null!=value) config.setProperty(key, value);    }        Properties sysProp = System.getProperties();    config.putAll(sysProp);        for(;;){        try{      confRes = ResourceBundle.getBundle(user_configure);      keys = confRes.getKeys();      while(keys.hasMoreElements()){       config.setProperty(keys.nextElement(), confRes.getString(keys.nextElement()));      }     }catch(Exception ex){}          if(isService) try{Thread.sleep(scanInterval); }catch(Exception ex){}     else break;    }   }      /**    * 线程方式启动    * @param threadPool 线程池容器,可以为null    */   public void start(ExecutorService threadPool){    isService = true;    Thread t = new Thread(this,this.getClass().getSimpleName());    if(null==threadPool){        t.start();    }else{     threadPool.execute(t);    }   }      public void stop(){    this.isService = false;   }      /**    * 设置配置文扫描间隔    * @param interval    */   public void setScanInterval(int interval){    this.scanInterval = interval;   }      /**    * 从配置文件中取值    * @param key    * @return 如果找不到(或这个键就没有值),则返回""    */   public static String getValue(String key){    String os = getOS().toLowerCase();    String ret = "";        if(-1!=os.indexOf("windows")){     ret = config.getProperty(key+".windows","");    }else if(-1!=os.indexOf("linux")){     ret = config.getProperty(key+".linux","");    }        if("".equals(ret)){     ret = config.getProperty(key, "");    }    return ret;   }      /**    * 从配置文件中取值,并把${args.key}的格式替换为args.value    * @param key     * @param args 参数    * @return    */   public static String getValue(String key,Map<String,String> args){    String value = getValue(key);    if("".equals(value.trim())) return "";        Set<Map.Entry<String,String>>values = args.entrySet();    for(Map.Entry<String,String> i: values){     value = value .replaceAll("\\${1}\\{{1}"+i.getKey()+"\\}{1}", i.getValue());    }        return value;   }      public static   String getOS(){    return System.getProperty("os.name");   }  }


systoolkit.properties

test=default test.  test.linux=linux test.  test.windows=windows test.  ping.command.linux=ping -c 1 -s 8 ${ip}  ping.command.windows=ping -n 1 -w 1 -l 8 ${ip}

 

端口扫描测试

/**    * 扫描端口    */   static void t2(){    new SystoolkitConfigure().run();        Discovery d = new Discovery(System.out);  //  d.scanPort("192.168.2", 1, 254, "22,23,80");        List<String> ips = new ArrayList<String>();    ips.add("192.168.2.22");    ips.add("192.168.2.23");    ips.add("192.168.2.54");    ips.add("192.168.2.55");    d.scanPort(ips,"22,23,80,100-200");   }
[root@xxxx ~]# java -jar discovery.jar  192.168.2.1:23  192.168.2.1:80  192.168.2.10:80  192.168.2.23:22  192.168.2.37:23  192.168.2.54:22  192.168.2.54:23  192.168.2.56:80  192.168.2.57:22  192.168.2.57:23  192.168.2.100:22  192.168.2.107:22  192.168.2.141:80  192.168.2.154:22  192.168.2.154:23  192.168.2.182:22  192.168.2.183:22  192.168.2.201:22

 

ping探测测试

/**    * ping扫描    */   static void t1(){    new SystoolkitConfigure().run();        Discovery d = new Discovery(System.out);    Map<String,Boolean> ret = d.ping("192.168.2");  //  System.out.println(ret);        List<String> ips = new ArrayList<String>();    ips.add("192.168.2.22");    ips.add("192.168.2.23");    ips.add("192.168.2.54");    ips.add("192.168.2.55");        ret = d.ping(ips);   }
[root@xxxx ~]# java -jar discovery.jar  192.168.2.1:true  192.168.2.2:false  192.168.2.3:false  192.168.2.4:false  192.168.2.5:false  192.168.2.6:true  192.168.2.7:false  192.168.2.8:true  192.168.2.9:false  192.168.2.10:true  192.168.2.11:true  192.168.2.12:false  192.168.2.13:false  192.168.2.14:false  192.168.2.15:false  192.168.2.16:false  192.168.2.17:false  192.168.2.18:true  192.168.2.19:false  192.168.2.20:false  192.168.2.21:false  192.168.2.22:true  192.168.2.23:true  192.168.2.24:false  192.168.2.25:true  192.168.2.26:false  192.168.2.27:true  192.168.2.28:false  192.168.2.29:false  192.168.2.30:true  192.168.2.31:false  192.168.2.32:true  192.168.2.33:false  192.168.2.34:false  192.168.2.35:false  192.168.2.36:false  192.168.2.37:true