2015-10-05 6 views
1

Может кто-нибудь помочь мне проверить сканер портов с определенным диапазоном IP-адресов с помощью командной строки. Как я могу убедиться, что порт сканирует с этим диапазоном IP.диапазон IP и сканер портов

args [0] и args [1] для диапазона IP-адресов, в то время как args [2] и args [3] для портального сканера.

Например я бег "Java Test 1.1.1.1 5-10" программа будет проверять IP-адреса от 1.1.1.1 до 1.1.1.5 на порты 0 - 10

Вот мой код:

import java.util.concurrent.*; 
import java.util.*; 
import java.net.*; 

// source http://stackoverflow.com/questions/11547082/fastest-way-to-scan-ports-with-java 

public class Test 
{ 
public static void main(String [] args) throws Exception 
{ 
    final ExecutorService es = Executors.newFixedThreadPool(20); 
    int bRange = 0; //Declare String called bRange with initial value of 0. 
    int eRange = 0; //Declare String called eRange with initial value of 0. 
    final int timeout = 200; 

    //byte[] ipAddr = InetAddress.getByName(args[0]).getAddress(); 
    //byte[] ipAddr1 = InetAddress.getByName(args[1]).getAddress(); 
    String ipAddr = args[0]; 
    String ipAddr1 = args[1]; 


    if (args.length != 3) 
    { 
     try 
     {    
      bRange = Integer.parseInt(args[2]); //Assign value of second argument to bRange. 
      eRange = Integer.parseInt(args[3]); //Assign value of third argument to eRange. 
     } 
     catch(NumberFormatException E) //If user enter invalid data. 
     { 
      System.out.println("You did not enter a valid number for arguments 2 and 3. Please try again with valid Integers."); 
      System.exit(0); 
     } 

     boolean fcheck = true; //DEBUG ONLY CAN DELETE 
     final List<Future<Boolean>> futures = new ArrayList<>(); 

     ArrayList<Integer> portRange = new ArrayList<Integer>((eRange - bRange)); //Declare an ArrayList of Integer values called portRange and set its initial size. 

     //For loop to randomize scans. 
     for(int port = bRange; port <= eRange; port++) 
     { 
      portRange.add(port); 

      //Use ArrayList of portRange and shuffle to go through each port number once. 
      Collections.shuffle(portRange); //Shuffle portRange. 

      int size = portRange.size(); //Declare Integer called size and assign value of portRange ArrayList size value. 
      int randPort = portRange.get(size-1); //Assign the last index of portRange ArrayList to Integer variable randPort. 

      System.out.println(randPort); //Show all the ports 

      //int randTimeout = randInt(30, 2000); //Assign random value to randTimeout by running method randInt(). PartD 

      futures.add(portIsOpen(es, ipAddr, randPort, timeout)); 

      portRange.remove(size - 1); //Remove last element in portRange ArrayList. 
     } 

     es.shutdown(); //Tell the executor service that it can't accept new tasks, but the already submitted tasks continue to run. 
     int openPorts = 0; //Declare Integer called openPorts and assign value of 0. 


     for(final Future<Boolean> f : futures) 
     { 
      if(f.get()) 
      { 
       openPorts++; 
      } 
     } 
     System.out.println("There are " + openPorts + " open ports on host " + ipAddr + " to " + ipAddr1 + " probed with a timeout of " + timeout + "ms"); 
     //Print statement show how many ports open based on the particular IP Address and the timeout. 
    }  
    else 
    { 
     System.out.println("Wrong number of arguments"); 
     System.out.println("Please try again"); 
    } 
} 

public static Future<Boolean> portIsOpen(final ExecutorService es, final String ipAddr, final int port, final int timeout) 
{ 
    return es.submit(new Callable<Boolean>() 
    { 
     @Override public Boolean call() 
     { 
      try //Try block, each time the For loop increments the Try block gets invoked. 
      { 
       Socket socket = new Socket(); //The Try block creates an instance of the Socket Class. 
       socket.connect(new InetSocketAddress(ipAddr, port), timeout); //Create a stream socket and connects it to specified port number at the specified IP Address. 
       socket.close(); //Close the socket connection. 
       System.out.println("open port found " + port); //Result show how many ports are open. 
       return true; 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
     } 
    }); 
} 
} 
+0

Что именно вы спрашиваете? –

ответ

0

Я полагаю, для определения диапазона ip-адресов гораздо удобнее использовать стандартную ноту CIDR. В этом случае вам нужно будет использовать только один дополнительный параметр, например 1.1.1.1/29, что означает, что диапазон IP-адресов от 1.1.1.1 до 1.1.1.6 и 1.1.1.7 является широковещательным адресом. Вы можете использовать Apache Commons Net класса SubnetUtils, чтобы определить диапазон и получить все включены адреса:

public static void main(String[] args) {  
    String subnet = "1.1.1.1/29"; 
    SubnetUtils utils = new SubnetUtils(subnet); 
    String[] addresses = utils.getInfo().getAllAddresses(); 
    for (String ip : addresses) { 
     System.out.println(ip); 
    } 
} 

Но как сейчас, мне кажется, что ваш пример проверяет только первый адрес указанного диапазона, потому что вы делаете не предоставляют никакой логики для повторения диапазона адресов, который вы даете.

Итак, если вы все еще хотите установить диапазон раньше, вам нужно преобразовать нотацию диапазона в список конкретных адресов, а затем добавить дополнительный цикл по этому списку и включить его в этот цикл через порты.

Чтобы получить этот список, вы можете использовать логику, как и в методе getIpList, просто нужно обеспечить exceptoin обработки и т.п. .:

public static List<String> getIpList(String startIp, int number) { 
    List<String> result = new ArrayList<>(); 
    String currentIp = startIp; 
    for (int i = 0; i < number; i++) { 
     String nextIp = nextIpAddress(currentIp); 
     result.add(nextIp); 
     currentIp = nextIp; 
    } 
    return result; 
} 

public static final String nextIpAddress(final String input) { 
    final String[] tokens = input.split("\\."); 
    if (tokens.length != 4) 
     throw new IllegalArgumentException(); 
    for (int i = tokens.length - 1; i >= 0; i--) { 
     final int item = Integer.parseInt(tokens[i]); 
     if (item < 255) { 
      tokens[i] = String.valueOf(item + 1); 
      for (int j = i + 1; j < 4; j++) { 
       tokens[j] = "0"; 
      } 
      break; 
     } 
    } 
    return new StringBuilder() 
      .append(tokens[0]).append('.') 
      .append(tokens[1]).append('.') 
      .append(tokens[2]).append('.') 
      .append(tokens[3]) 
      .toString(); 
} 

И тогда вы можете получить список IP в пределах диапазона, добавить петлю :

List<String> ipRange = getIpList(ipAddr, ipAddr1); 
for(String ipaddr : ipRange) { 
    for (int port = bRange; port <= eRange; port++) { 
    portRange.add(port); 

    //Use ArrayList of portRange and shuffle to go through each port number once. 
    Collections.shuffle(portRange); //Shuffle portRange. 

    int size = portRange.size(); //Declare Integer called size and assign value of portRange ArrayList size value. 
    int randPort = portRange.get(size - 1); //Assign the last index of portRange ArrayList to Integer variable randPort. 

    System.out.println(randPort); //Show all the ports 

    //int randTimeout = randInt(30, 2000); //Assign random value to randTimeout by running method randInt(). PartD 

    futures.add(portIsOpen(es, ipaddr, randPort, timeout)); 

    portRange.remove(size - 1); //Remove last element in portRange ArrayList. 
    } 
} 
Смежные вопросы