2013-04-06 20 views
8

to jest mój pierwszy wpis tutaj, więc nie jestem pewien, co powiedzieć/zapytać. W każdym razie, próbuję utworzyć prosty program java, który uruchamia polecenia wiersza polecenia z programu java, głównie używane do ping flood (sam ping powodzi).Jak używać programu java do uruchamiania poleceń wiersza poleceń?

Tu jest mój bieżący kod

public class Core extends JFrame { 

JTextField ipTextField; 

int packets = 0; 

boolean running = false; 

public Core() { 
    super("Fatique"); 

    Container container = getContentPane(); 
    JButton bAttack = new JButton("Start Attack"); 
    JButton bStop = new JButton("Stop Attack"); 
    JPanel jPanel = new JPanel(); 

    container.setLayout(new FlowLayout()); 
    ipTextField = new JTextField("IP Address", 30); 
    container.add(ipTextField); 

    bAttack.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      String input = ipTextField.getText(); 
      String[] value = input.split(":"); 

      int amountOfPackets = Integer.parseInt(value[1]); 

      exec("cmd /c" + input + " -t -n " + amountOfPackets); 
      running = true; 
     } 
    }); 

    bStop.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      stop(); 
     } 
    }); 

    if(!running) { 
     jPanel.add(bAttack); 
    } else { 
     jPanel.add(bStop); 
    } 

    add(jPanel); 
} 

public void exec(String cmd) { 
    try { 
     Process p = Runtime.getRuntime().exec(cmd); 
     System.out.println(getOutput(p) + " - " + getPacketsSent()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public String getOutput(Process p) { 
    String output = null; 

    try { 
     BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line = null; 
     while ((line = in.readLine()) != null) { 
      output = line; 
      packets++; 
     } 

     return output; 
    } catch (IOException e) { 
     System.err.println(e.getStackTrace()); 
    } 

    return null; 
} 

public int getPacketsSent() { 
    return packets; 
} 

public void stop() { 
    exec("cmd /c break"); 
    running = false; 
} 

public static void main(String[] args) { 
    Core c = new Core(); 
    c.setSize(500, 300); 
    c.setVisible(true); 
    c.setResizable(false); 
    c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    c.setLocationRelativeTo(null); 
} 

Jestem zupełnie nowy w Javie, tak że nie może robić to, co chcę robić. Co chcę zrobić, to wprowadzić adres IP w polu tekstowym i podzielić ją z „:”, a potem ilość pakietów, na przykład

127.0.0.1:100 

Choć teraz, gdy próbuję użyć tego ip i ilość pakietów, zwraca "null - 0" (z metody exec) i nie jestem nawet pewien, czy zrobił coś związanego z pingiem.

To, co próbuję osiągnąć, to tak, jak już powiedziałem: ping się zalewam, a następnie wyprowadzam cokolwiek otrzymuję jako odpowiedź, chociaż nie mam pojęcia, czy ten kod robi coś z tym związanego, w większości korzystam z logiki podczas kodowania Jawa.

public String getOutput(Process p) { 
    String output = null; 

    try { 
     BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line = null; 
     while ((line = in.readLine()) != null) { 
      output = line; 
      packets++; 
     } 

     return output; 
    } catch (IOException e) { 
     System.err.println(e.getStackTrace()); 
    } 

    return null; 
} 

Czy ktoś mógłby mi wyjaśnić, dlaczego mój kod nie działa tak, jak chcę, aby działał? Proszę nie osądzać, jak już powiedziałem, jestem całkiem nowy w programowaniu java.

EDYCJA: Oto szybkie "informacyjne" wyjaśnienie tego, co próbuję osiągnąć.

  1. Podaję adres IP i liczbę pakietów, które chcę wysłać. W tym wyjaśnieniu używam localhost ip i 5 pakietów. About to send 5 packets to localhost ip
  2. Rozpoczynam atak. W tej części, chcę, aby uruchomić program wiersza polecenia cmd

    ping 127.0.0.1 -t -n 5

    127.0.0.1 będąc ip, że mogę umieścić w polu tekstowym w moim programie, a 5 jest ilość pakietów umieszczonych w polu tekstowym.

  3. zacząłem atak, więc to, co powinno się zdarzyć w wierszu poleceń: 5 packets sent to locahost

    Język jest fiński, ale nadal to samo.

    To jest podstawowe wyjaśnienie tego, co próbuję osiągnąć, mam nadzieję, że ktoś zrozumiał i może pomóc/wyjaśnić, dlaczego mój kod nie działa lub działa, ale nie drukuje właściwych linii w konsoli Eclipse.

+0

Spróbuj wydrukować nieprzetworzone dane wyjściowe strumienia wejściowego procesu. – Zyerah

+0

Jeszcze nie, ale prawdopodobnie nie zrobiłem tego, co mi kazałeś. System.out.println (in.readLine()); Właśnie tego próbowałem, teraz zwraca "null null - 1" – Woobie

Odpowiedz

4

Spróbuj czegoś takiego:

try { 
     Runtime rt = Runtime.getRuntime(); 
     Process p = rt.exec("ping 192.168.16.67"); 
     InputStream in = p.getInputStream(); 
     OutputStream out = p.getOutputStream(); 
     InputStream err = p.getErrorStream(); 
     p.destroy(); 
} catch(Exception exc) {} 

Następnie będziesz musiał odczytać zmienną out do analizowania danych wyjściowych polecenia ping ciągły.

+0

To nie pomaga im dowiedzieć się, co zrobili źle. Uwaga, ich pytanie nie brzmiało: "Jak to zrobić?", Ale raczej "Dlaczego to nie działa?". Tak naprawdę to nie odpowiada na pytanie: – Zyerah

+0

^Dokładnie, dzięki. Zauważyłem, że zapomniałem wstawić "ping" w poleceniu .. teraz pakiety int idą w górę 1 za każdym razem, gdy naciskam przycisk start, co nie jest tym, na co miałem wpływ.Odnowienie jest nadal zerowe – Woobie

4

Wystąpił problem z twoją metodą getOutput. Wygląda na to, że chcesz zebrać każdą linię danych wyjściowych. W rzeczywistości, ponieważ przypisujesz line do output, zwrócisz tylko ostatnią linię przed końcem strumienia.

Aby rozwiązać ten problem, należy zmienić

output = line; 

do

output += line + "\n"; 

Albo być bardziej poprawne:

output += line + LINE_SEPARATOR; 

gdzie wcześniej ogłosił ostatni jak:

final String LINE_SEPARATOR = System.getProperty("line.separator"); 

To nie wyjaśnia bezpośrednio, dlaczego otrzymujesz null, ale może to być spowodowane tym, że uruchomione polecenie zapisuje wyniki do strumienia "błędu", a nie do strumienia "wyjściowego".

+0

Nadal powracający null.Jeśli po prostu używam System.out. println (linia), to coś w rodzaju roboty, ale nie w tym, w jaki sposób tego chcę. To czego chcę, to wydrukować odpowiedź, na przykład, kiedy wpisuję "ping 127.0.0.1 -t -n 1", to będzie aby odpowiedzieć "Odpowiedź od 127.0.0.1: bajty = 32 czas <1ms TTL = 128", i to jest to, co chcę wydrukować za każdym razem.W moim programie, jeśli wpisze "127.0.0.1:5", to jest będzie drukować odpowiedź za każdym razem, co w tym przypadku będzie 5, ponieważ jest to ilość wysłanych przeze mnie pakietów.Z moim bieżącym kodem, bez względu na to, ile pakietów wysyłam, drukuje -> – Woobie

+0

"Ping -pyynt ": tuntematon to" nt "127.0.0.1:2." – Woobie

0
bAttack.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     String input = ipTextField.getText(); 
     String[] value = input.split(":"); 

     int amountOfPackets = Integer.parseInt(value[1]); 

     try { 
      p=Runtime.getRuntime().exec("ping -n "+amountOfPackets+" "+value[0]); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     running = true; 


    } 

Po prostu niewielka modyfikacja kodu. dostać wyjście jest jako:

public String getOutput(Process p) { 
String output = null; 

try { 
    BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = null; 
    while ((line = in.readLine()) != null) { 
     output =output+ line+"\n"; 
     packets++; 
    } 

    return output; 
} catch (IOException e) { 
    System.err.println(e.getStackTrace()); 
} 

return null; 
} 

Oto wyjściowy jest JTextArea Brałem do wyświetlania danych wyjściowych procesu PING. Nie mogę pokazać ci wyników, ponieważ brakuje mi reputacji.

Nie wiem, dlaczego pierwszy wiersz jest pusty. W każdym razie to działa.

Mam nadzieję, że ci to pomoże. Mieć dobre kodowanie czasu.

Powiązane problemy