2014-03-29 48 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