Как отправить пользовательский ввод на терминал из java-программы (т.е. программно)?

Я выполняю команду из java-программы, например

Process myProcess = Runtime.getRuntime().exec("sudo cat /etc/sudoers"); //It asks for password so I send password through outputstream from my program.

InputStream inputStream = myProcess.getInputStream();
OutputStream outputStream = myProcess.getOutputStream();
outputStream.write("mypassword".getBytes()); // write password in stream
outputStream.flush();
outputStream.close();

Но проблема в том, что он снова запрашивает у меня пароль, так как я уже отправляю пароль через поток вывода из моей программы. Для решения этого я пытался так много раз, но на самом деле не сделал.

Используя сценарий оболочки, я могу указать пароль для терминала, и моя программа работает нормально, но это не самый гибкий способ.

Можете ли вы предложить мне какой-либо способ предоставления пароля через мою программу Java? (вместо программирования оболочки)


person Ruju    schedule 30.05.2012    source источник
comment
это слишком много работы для простой задачи. Просто отправьте имя пользователя/пароль команде при ее вызове. Прочтите эти команды для точного синтаксиса   -  person MozenRath    schedule 30.05.2012
comment
Вы пробовали отправить \n символ после пароля? Внешнему приложению может потребоваться завершить ввод с помощью CR и/или LF.   -  person npe    schedule 30.05.2012
comment
Может быть терминальная программа требует ввода в определенном формате.   -  person UVM    schedule 30.05.2012
comment
да, я также пытаюсь использовать символ '\n' после пароля, но проблема остается прежней   -  person Ruju    schedule 30.05.2012
comment
@Ruju Я пытаюсь сделать что-то подобное, можете ли вы предоставить сценарий оболочки, который, как вы сказали, отлично работает для вас?   -  person Nikhil Wagh    schedule 23.05.2018
comment
Я работал над этим давным-давно. Вы можете преобразовать те же шаги аутентификации в файл сценария оболочки и вызвать этот файл сценария непосредственно из java. Это сработает обязательно.   -  person Ruju    schedule 24.05.2018


Ответы (1)


Вы можете сделать это, используя опцию -S sudo:

String[] cmd = {"/bash/bin","-c","echo yourpassword| sudo -S your command"}; 
Runtime.getRuntime.exec(cmd); 

Но я не уверен, что это рекомендуется.

Я не автор, я нашел это там: http://www.coderanch.com/t/517209/java/java/provide-password-prompt-through-Java

person Denys Séguret    schedule 30.05.2012