2013-06-25 4 views
0

Я использую Runtime для выполнения команды, которая принимает пароль дважды (например: введите пароль, проверьте пароль). Я использую следующий код. Проблема, с которой я столкнулся, - зависание программ, потому что она ждет подтверждения пароля. 1-й пароль передается должным образом (я верю, удалив подтверждение пароля из моей команды и в java-коде, и он работает), проверьте, что пароль не передается команде, и команда ждет подтверждения пароля на неопределенный срок. Пожалуйста, дайте мне знать, есть ли у кого-нибудь какие-либо санкции.Как передать несколько паролей в java-процесс

try 
    { 
     runtime = Runtime.getRuntime(); 
     process = runtime.exec("<<my command>>""); 
     String inLine = ""; 
     String errLine = ""; 
     StringBuffer inBuffer = new StringBuffer(); 
     StringBuffer errBuffer = new StringBuffer(); 

     PrintWriter pw = new PrintWriter(process.getOutputStream()); 
     pw.print("<<password>>"+"\n"); 
     pw.print("<<verify password>>"+"\n"); 
     pw.flush(); 

     BufferedReader stdin = new BufferedReader(new InputStreamReader(
       process.getInputStream())); 
     BufferedReader stderr = new BufferedReader(new InputStreamReader(
       process.getErrorStream())); 

     while ((inLine = stdin.readLine()) != null) { 
      inBuffer = inBuffer.append(inLine + "\n"); 
     } 
     stdin.close(); 
     System.out.println("Output messages of cmd " + inBuffer.toString()); 

     while ((errLine = stderr.readLine()) != null) { 
      errBuffer = errBuffer.append(errLine + "\n"); 
     } 
     stderr.close(); 
     System.out.println("Error messages of cmd " + errBuffer.toString()); 

     process.waitFor(); 
     int exitCode = process.exitValue(); 
     System.out.println("cmd " + " exited with code " + exitCode); 


    } 
+0

ли выходное что-нибудь процесс на консоль, прежде чем вы должны написать пароль? – MadProgrammer

+0

Нет, он ничего не выводит на консоль до того, как я напишу пароль –

+0

Итак, если вы запустили программу из командной строки, она вообще не отобразила какое-либо приглашение? – MadProgrammer

ответ

0

Оба while ((inLine = stdin.readLine()) != null) { и while ((errLine = stderr.readLine()) != null) { будет блокировать ваш основной поток, пока данные не будут доступны. Может быть, ваша команда выплевывает что-то в stderr, но вы не можете ее увидеть, потому что ваш основной поток заблокирован в stdin read loop

Лучше потреблять stdin и stderr с помощью отдельного потока, вы можете легче отлаживать код

0

Попробуйте использовать эти вещи:

System.out.println("<<password>>"); 
String pw; 
BufferedReader stdin = new BufferedReader(new InputStreamReader(
      System.in)); 
while ((pw = stdin.readLine()) != null){ //Waits for a reply for the first password 
    if (pw != ""){ 
     break; //This breaks the loop, and 'pw' is the password entered. 
    } 
} 

Повторять, что для

< < verifypassword >>

и изменить переменные. Это должно сработать!

Вот verifypassword

System.out.println("<<verifypassword>>"); 
String pw2; 
BufferedReader stdin2 = new BufferedReader(new InputStreamReader(
      System.in)); 
while ((pw2 = stdin2.readLine()) != null){ //Waits for a reply for the first password 
    if (pw2 != ""){ 
     break; //This breaks the loop, and 'pw' is the password entered. 
    } 
} 
+0

Спасибо за ваш ответ. Код, приведенный выше, похоже, предназначен для чтения пароля из командной строки. В моем случае команда, которую я выполняю с использованием RunTime, дважды проверяет пароль (пароль и пароль проверки), и я хочу передать значения этому процессу. Когда я это делаю, первый пароль считывается процессом, и он ждет подтверждения пароля (хотя я дважды написал пароль для процесса) PrintWriter pw = new PrintWriter (process.getOutputStream()); pw.print ("<>" + "\ n"); pw.print ("<< проверить пароль >>" + "\ n"); pw.flush(); –

+0

Итак, что вы хотите, это программа, выполняющая программу с паролем, переданным как параметры? – KeirDavis