2014-03-29 43 views
0

我想實現的是從java應用程序安裝一個軟件,該軟件是我創建的
。我有gksudo的許可。然後,我輸入我的通行證,程序開始工作,直到出現yes/no選項。我怎麼能通過這個問題?使用sudo命令從Java項目安裝軟件

import java.io.IOException; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 

import java.io.IOException; 


public class TestApp { 
public static void main(String[] args) { 
    Process ls = null; 

    BufferedReader input = null; 

    String line = null; 

    try { 

     ls = Runtime.getRuntime().exec(
       new String[] { "gksudo", "apt-get", "install", "PACKAGE" }); 
     try { 
      ls.wait(6000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     ls = Runtime.getRuntime().exec(new String[] { "y" }); 
     input = new BufferedReader(new InputStreamReader(
       ls.getInputStream())); 

    } catch (IOException e1) { 
     e1.printStackTrace(); 
     System.exit(1); 
    } 

    try { 
     while ((line = input.readLine()) != null) { 
      System.out.println(line); 
     } 

     ls.destroy(); 

    } catch (IOException e1) { 
     e1.printStackTrace(); 
     System.exit(0); 
    } 
    } 

    } 

回答

0

容易 - 有些特別 - 解決方案: Dont't EXEC 「和apt-get安裝...」,但 「易於得到-y安裝...」。這會抑制任何問題以確認。

更一般的方法: Runtime.exec()創建一個流程實例。你在代碼中做的是創建兩個「apt-get」和「y」的過程。您需要做的是:創建一個流程實例,並將字符「y」輸入到此流程的輸入通道中。這是通過創建流程(如您已經完成的),收集對其輸入的引用並將「y \ n」發送到此輸入來實現的。

通過調用Process.getOutput()可以獲得輸入,這會爲您提供連接到流程輸入的OutputStream。

這有點像所有結果:

ls = Runtime.getRuntime().exec(
      new String[] { "gksudo", "apt-get", "install", "PACKAGE" }); 
ls.getOutput().write("y\n".getBytes()); 
+0

太謝謝你了。 – user3142980

+0

我意識到我無法正確使用apt-get和gksudo。由於apt-get是CLI工具,因此它不能用於GUI環境(gksudo)。所以,我必須使用sudo和apt-get。但在java程序中,我無法執行sudo命令。 – user3142980

+0

Runtime.exec()通常會生成一個沒有關聯tty的進程,所以sudo不可能打印出密碼查詢。應該可以運行「sudo -A ....」來激活程序sudo可能會開始收集密碼。 – blafasel