Как использовать Java ProcessBuilder для выполнения./filename в Linux
В настоящее время я использую ProcessBuilder для запуска некоторого файла, такого как test.out. Вот часть моего кода
ArrayList cmd = new ArrayList();
cmd.add("sudo");
cmd.add("./test.out");
String s = "";
try{
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.directory(new File("/myPath"));
pb.redircErrorStream(true);
Process p = pb.start();
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferReader br = new BufferReader(isr);
String line = "";
while((line = br.readLine()) !=null)
{
s+=line;
}
System.out.println(s);
}
Я вывел правильный путь ("/myPath"). когда я удаляю строку
`cmd.add("sudo")`
вывод даст мне строку:
oneoflib:must be root. Did you forgot sudo?
Но как только я добавлю
cmd.add("Суд");
ничего не выводится.
Есть кто-нибудь, что не так с этим?
Я могу запустить sudo ./test.out из терминала, который работает нормально. Я использую затмение BTW. Большое спасибо.
1 ответ
Я предполагаю, что получение потока ошибок от процесса может быть полезным здесь, чтобы помочь отладить проблему.
Это должно помочь, рассмотрим следующий скрипт bash и назовем его yourExecutable. Давайте также предположим, что он имеет все необходимые разрешения:
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit
fi
echo "You are running as root"
Когда бегать без sudo
это печатает "Please run as root"
в противном случае это печатает "You are running as root"
Команда, т.е. первый аргумент в вашем списке должен быть bash
, если это оболочка, которую вы используете. Первый аргумент должен быть -c
поэтому команды будут считаны из следующей строки. Строка должна быть echo <password> | sudo -S ./yourExecutable
, Это не совсем лучший способ отправить пароль в sudo, но я не думаю, что в этом суть. -S
sudo запросит пароль, который записывается в stdout и передается в sudo.
public static void main(String[] args) throws IOException {
Process process = new ProcessBuilder("bash", "-c", "echo <password> | sudo -S ./yourExecutable").start();
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String string;
while((string = errorReader.readLine()) != null){
System.out.println(string);
}
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while((string = reader.readLine()) != null){
System.out.println(string);
}
}
Вывод на моей машине выглядит так:
Password:
You are running as root