2015-04-15 59 views
1

我正嘗試使用Web瀏覽器與服務器上的CLI進行交互。在服務器端,我使用在JBoss AS 7.1.1.Final上運行的Java Servlet。 CLI是一個ovirt引擎工具(ovirt-iso-uploader)。爲了使用它,您必須在請求時提供REST API密碼。無法使用Java ProcessBuilder輸入密碼以與CLI進行交互

因此,這裏是下面的代碼我使用與CLI交互:

private String executeCommand(String command) { 

    System.out.println("Executing command: " + command); 

    String[] commands = new String[]{"/bin/sh","-c",command}; 

    try { 
     ProcessBuilder builder = new ProcessBuilder(commands); 
     builder.redirectErrorStream(true); 
     Process p = builder.start(); 

     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 

     String line = ""; 

     while ((line = reader.readLine())!= null) { 
      System.out.println(line); 

      if (line.contains("Please provide the REST API password")){ 
       writer.write("password\n"); 
       writer.flush(); 

      } 

     } 

    } catch (Exception e) { 
     e.printStackTrace(); 

    } 
} 

不過,我使用的是什麼輸入的命令,我一直有同樣的問題。 (在這個例子中我使用的命令ovirt-iso-uploader list列出所有ISO存儲域,你可以找到CLI here的文檔)

11:31:34,282 INFO [stdout] (http--0.0.0.0-8080-2) Executing command: ovirt-iso-uploader list 
Please provide the REST API password for the [email protected] oVirt Engine user (CTRL+D to abort): 

所以執行此封端爲CLI正在等待密碼和Servlet無法看到Please provide the REST API password for the [email protected] oVirt Engine user (CTRL+D to abort):行,因爲它沒有發送到[stdout]。但是,如果我直接在終端中手動輸入密碼,它正在工作。

因此,我的問題是如何從CLI讀取密碼請求並回答它?

謝謝你的時間。

+0

您可能要檢查類似於「期望」庫的功能,請參閱http://stackoverflow.com/questions/6394836/ssh-in-java-app-with-expect-like-functionality ...只使用Java的「內置」功能自己做這件事可能會變得很難** – GhostCat

+0

你確定你的if條件是真的嗎?你可以在裏面放一個println來確認嗎? – assylias

+0

@Jägermeister謝謝我會看看。但是,你是否知道爲什麼密碼請求不在'[stdout]'中? –

回答

0

我會建議使用緩衝讀取器是錯誤的,因爲它可能正在等待換行符結尾的換行符,因爲它不在那裏,因此不能返回一行。我想你將不得不直接讀取流。也許逐字符或逐字節地逐字符。

也可能沒有必要等待提示。在UNIX shell編程常見的是提供標準輸入不參考提示,如:

Command <! 
Lineone 
line two 
!