2013-08-14 2 views
2

У меня есть этот код, чтобы выполнить команду с и без использования sudo опциикоманда Sudo с помощью Java не работает

String sudoScript = "sudo -u root -S ls /"; 
String script = "ls /"; 
try { 
    System.out.println("==================================="); 
    System.out.println("command="+sudoScript); 
    Process p1 = Runtime.getRuntime().exec(sudoScript); 
      System.out.println("p2.waitFor()="+p1.waitFor()); 
    BufferedReader stdInput1 = new BufferedReader(new InputStreamReader(p1.getInputStream())); 
    while ((sudoScript = stdInput1.readLine()) != null) { 
      System.out.println(script); 
    } 
    System.out.println("==================================="); 
    System.out.println("command="+script); 
    Process p2 = Runtime.getRuntime().exec(script); 
      System.out.println("p2.waitFor()="+p2.waitFor()); 
    BufferedReader stdInput2 = new BufferedReader(new InputStreamReader(p2.getInputStream())); 
    while ((script = stdInput2.readLine()) != null) { 
      System.out.println(script); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

И это своего рода выход я Get-

=================================== 
command=sudo -u root -S ls/
p2.waitFor()=1 
=================================== 
command=ls/
p2.waitFor()=0 
bin 
boot 
cgroup 
data 
dev 
etc 
home 
home.save 
lib 
lost+found 
media 
mnt 
null 
opt 
opt.save 
proc 
root 
sbin 
selinux 
srv 
sys 
tmp 
usr 
var 

Если вы наблюдаете , Я не могу получить тот же результат, используя команду sudo. Что-то я пропустил здесь?

+0

ли вы предоставить разрешения на использование Sudo для пользователя, запустившего сценарий? – fedorqui

+0

да я. Он отлично работает, когда я выполняю его в терминале в качестве команды. – AlwaysALearner

+0

Но спрашивает ли он пароль? Вы можете использовать выражение 'NOPASSWD:' в sudoers, чтобы избежать этого. – fedorqui

ответ

0

вы должны иметь возможность подключиться паролем к команде sudo.

+0

пароль - это не то, о чем я беспокоюсь. мой не просит его. – AlwaysALearner

+0

Вы пробовали это? – Ingo

+0

@Ingo да, у меня есть ... в терминале тоже .. – AlwaysALearner

0

Команда sudo -u root -S ls / запрашивает пароль пользователя.

Что-то вроде echo '[password]' | sudo -u root -S ls / может сделать трюк.

Примечание: Для этого требуется строгое кодирование пароля. Скорее всего, это не лучшая идея.

EDIT: Согласно man sudo, необязательный вариант -u root. Запуск sudo -S ls / будет иметь тот же эффект.

+1

java выполнит его как обычную команду 'echo' и отобразит вывод как' [пароль] | sudo -u root -S ls/' – AlwaysALearner

+0

@ user1649068 Я отредактировал команду. Как и на моей машине (в командной строке). – maxf130

+0

Работает ли он от java? – akostadinov

1

В настоящее время большинство дистрибутивов имеют sudo, чтобы требовать выполнения tty.

попытка (в/и т.д./sudoers):

Defaults requiretty 

или

Defaults!/path/to/program !requiretty 

Вы должны убедиться, что Судо не требует пароль для этого пользователя для этой конкретной команды (например ls /) или вам нужно поставить его на sudo.

UPDATE: Кстати, это хорошая идея, чтобы прочитать поток ошибок, а поэтому мы не должны догадаться, что случилось с выполнением команды

+0

эта команда не работает для меня. Я получаю ошибку 'command not found' – AlwaysALearner

+0

@ user1649068, отредактированный ответ, чтобы указать, что это' sudoers' директива. – akostadinov

Смежные вопросы