2016-07-27 3 views
1

В настоящее время я использую ProcessBuilder для запуска некоторого файла, такого как test.out. Вот некоторые из моего кодаКак использовать Java ProcessBuilder для выполнения ./filename в linux

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); 
} 

I выходного пути, который является правильным ("/ myPath"). когда я удалить линию

`cmd.add("sudo")` 

выход даст мне строку:

oneoflib:must be root. Did you forgot sudo? 

Но как только я добавить

cmd.add ("Суд");

нет ничего выходного.

Есть ли какие-либо ошибки в этом?

Я могу запустить sudo ./test.out из терминала, который отлично работает. Я использую eclipse BTW. спасибо.

+0

Почему вы переменная s, определенной в коде? Разве вы не хотели печатать в своем последнем заявлении? Другими словами: System.out.println (s); – mdewit

+0

@mdewit sry, вы были правы, я изменил код, спасибо. Я просто хочу получить вывод терминала. – Kun

ответ

2

Я думаю, что получение потока ошибок из процесса может быть полезным здесь, чтобы помочь отладить проблему.

Это должно помочь, рассмотрим следующий сценарий bash и назовем его выполнимым. Предположим также, что у него есть все необходимые разрешения:

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 
+0

Спасибо за ваш ответ, например, в части эха, мой пароль 123456, поэтому я должен написать как «echo <123456>» или без «<>». – Kun

+0

без <> - это то, что вы хотите. – Imposter

+0

после запуска кода, он по-прежнему сохраняет пустой вывод. – Kun