Как использовать 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
Другие вопросы по тегам