Прежде всего, я надеюсь, что это не используется в злых целях. Ваш пример "rm -rf /*"
вызывает у меня некоторое беспокойство.
Если вы сделаете Runtime.getRuntime().exec("bash")
, вы получите оболочку, в которую сможете отправлять команды и получать ответы. Так, например, вы можете привязать консоль к ней:
final Process process = Runtime.getRuntime().exec("bash");
new Thread() {
public void run() {
try {
InputStreamReader reader = new InputStreamReader(process.getInputStream());
for(int c = reader.read(); c != -1; c = reader.read()) {
System.out.print((char)c);
}
} catch(IOException e) {
e.printStackTrace();
}
}
}.start();
// (Same for redirecting the process's error stream to System.err if you want)
InputStreamReader fromKeyboard = new InputStreamReader(System.in);
OutputStreamWriter toProcess = new OutputStreamWriter(process.getOutputStream());
for(int c = fromKeyboard.read(); c != -1; c = fromKeyboard.read()) {
toProcess.write((char)c);
toProcess.flush();
}
Это хороший способ поэкспериментировать и посмотреть, что ваша ОС позволит вам сделать. В Mac OS, если я хочу выполнить команду sudo из этого процесса, я сталкиваюсь с проблемой, что он не может принять мой пароль от STDIN, потому что на самом деле это не оболочка входа в систему. Итак, я должен сделать это:
SUDO_ASKPASS="password.sh" sudo -A <command>
... где «password.sh» просто повторяет мой пароль, и это команда, которую я хочу запустить от имени пользователя root (я использовал хороший безопасный «pwd» вместо вашего примера wipe-my-root-filesystem).