#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, там много интересного 🙂