Как использовать программу Java для запуска команд командной строки?

Пишу сюда впервые, поэтому не знаю, что сказать/спросить. В любом случае, я пытаюсь создать простую java-программу, которая запускает команды командной строки из java-программы, в основном используемой для ping-флуда (сам пинг-флуд).

Вот мой текущий код

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);
}

Я совсем новичок в java, так что это может не делать то, что я хочу. Что я хочу сделать, так это ввести IP-адрес в текстовое поле и разделить его с помощью «:», а после этого количество пакетов, например

127.0.0.1:100

Хотя теперь, когда я пытаюсь использовать этот ip и количество пакетов, он возвращает «null - 0» (из метода exec), и я даже не уверен, сделал ли он что-нибудь, связанное с пингом.

То, что я пытаюсь сделать, это, как я уже сказал, пинговать себя, а затем выводить все, что я получаю в качестве ответа, хотя я понятия не имею, делает ли этот код что-либо даже связанное с этим, я в основном использую логику при кодировании java.

 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;
}

Может ли кто-нибудь объяснить мне, почему мой код не работает так, как я хочу, чтобы он работал? Пожалуйста, не судите строго, как я уже сказал, я совсем новичок в программировании на Java.

РЕДАКТИРОВАТЬ: Вот краткое «информативное» объяснение того, чего я пытаюсь достичь.

  1. Я ввожу IP-адрес и количество пакетов, которые хочу отправить. В этом объяснении я использую локальный IP-адрес и 5 пакетов. Об отправке 5 пакетов на локальный IP-адрес
  2. Я начинаю атаку. В этой части я хочу, чтобы программа запускала команду приглашения cmd

    пинг 127.0.0.1 -т -н 5

    127.0.0.1 — это IP-адрес, который я указал в текстовом поле своей программы, а 5 — это количество пакетов, которые я поместил в текстовое поле.

  3. Я начал атаку, вот что должно произойти в командной строке: 5 пакетов отправлено на локахост

    Язык финский, но все равно то же самое.

    Это основное объяснение того, что я пытаюсь сделать, надеюсь, кто-то понял и может помочь/рассказать, почему мой код не работает или работает, но не печатает правильные строки в консоли eclipse.


person Woobie    schedule 06.04.2013    source источник
comment
Попробуйте распечатать необработанный вывод входного потока процесса.   -  person    schedule 06.04.2013
comment
Все еще ноль, хотя я, вероятно, не сделал того, что вы мне сказали. System.out.println(in.readLine()); Это то, что я пробовал, теперь он возвращает null null - 1   -  person Woobie    schedule 06.04.2013


Ответы (3)


Проблема с вашим методом getOutput. Похоже, вы собираетесь собирать каждую строку вывода. Но на самом деле, поскольку вы назначаете line output, вы вернете только последнюю строку перед концом потока.

Чтобы исправить это, измените

    output = line;

to

    output += line + "\n";

Или, если быть более правильным:

    output += line + LINE_SEPARATOR;

где вы ранее объявили последний как:

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

Это не объясняет напрямую, почему вы получаете null, но это может быть связано с тем, что выполняемая вами команда записывает вывод в поток «ошибок», а не в поток «выход».

person Stephen C    schedule 06.04.2013
comment
Все еще возвращает ноль. Если я просто использую System.out.println(line), это работает, но не так, как я хочу. Я хочу, чтобы он распечатал ответ, например, когда я набираю ping 127.0.0.1 -t -n 1, он ответит Ответ от 127.0.0.1: bytes=32 time‹1ms TTL=128, и что это то, что я хочу печатать каждый раз. В моей программе, если я наберу 127.0.0.1:5, она будет печатать ответ каждый раз, что в данном случае будет 5, потому что это количество отправленных мною пакетов. С моим текущим кодом, независимо от того, сколько пакетов я отправлю, он печатает --› - person Woobie; 06.04.2013
comment
Пинг-пйынт»: tuntematon is„nt„ 127.0.0.1:2. - person Woobie; 06.04.2013

Попробуйте что-то вроде этого:

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) {}

Затем вам нужно будет прочитать переменную out, чтобы непрерывно анализировать вывод команды ping.

person Pablo Santa Cruz    schedule 06.04.2013
comment
Это не поможет им понять, что они сделали не так. Обратите внимание, их вопрос был не «Как мне это сделать?» а скорее Почему это не работает? Таким образом, это на самом деле не отвечает на вопрос. - person ; 06.04.2013
comment
^ Точно, спасибо. Я только что заметил, что забыл указать ping в команде ... теперь пакеты int увеличиваются на 1 каждый раз, когда я нажимаю кнопку запуска, а это не то, к чему я стремился. Вывод по-прежнему нулевой. - person Woobie; 06.04.2013

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;


    }

Просто небольшая модификация вашего кода. получить вывод как:

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;
}

Здесь вывод JTextArea, который я использовал для отображения вывода процесса PING. Я не могу показать вам результат, потому что у меня нет репутации.

Я не знаю, почему первая строка пуста. Во всяком случае, это работает.

Надеюсь, это поможет вам. Удачного кодирования.

person Rushi M Thakker    schedule 06.12.2014