Запуск командной строки с пользовательским вводом из Java

#java #shell #variables

#java #оболочка #переменные

Вопрос:

 public class Controller {

public String printResults(Process process) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line = "";
    String container = "";
    while ((line = reader.readLine()) != null) {
        container = container   line   "n";
        System.out.println(line);
    }
    return container;
}

public String executeCmd(String firstname,  String lastname) throws IOException {
    
    String command = "./myprogram -n "   firstname   " -s "   lastname;
    Process p = Runtime.getRuntime().exec(command, null, new File("/home/user/myprogram/build/"));
    return "Hi, n"   printResults(p);
}
}
  

Это позволяет мне запускать одну команду с атрибутами из определенного каталога и получать результат.

Однако у меня есть более крупная программа, которая запрашивает у пользователя ввод данных с терминала.

 user@debian:~/program/build/$./program
...
Enter Value: 5
...
Enter Name: Hanz
...
Enter State: GE

Output..
  

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

Комментарии:

1. Построение команды в виде строки — на любом языке программирования — это быстрый путь к серьезным проблемам безопасности. Базовый интерфейс ОС в UNIX execve — использует массив строк; ваш код должен делать то же самое. В противном случае вам нужно беспокоиться о том, есть ли у вас, скажем, firstname $(rm -rf ~)

Ответ №1:

Во-первых, перепишите свой код для использования ProcessBuilder ; это в значительной степени просто замена exec на new ProcessBuilder .

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

Затем запустите start() конструктор, и это даст вам Process объект. Вы можете использовать это, чтобы получить OutputStream , а затем вы можете записать свою строку в это: p.getOutputStream().write("5nHanzGE".getBytes());

Есть несколько разных способов выполнить эту работу; Взгляните на API Process и ProcessBuilder, там много интересного 🙂