Can';t使用Java ProcessBuilder输入密码以与CLI交互

Can';t使用Java ProcessBuilder输入密码以与CLI交互,java,linux,jboss,command-line-interface,Java,Linux,Jboss,Command Line Interface,我正在尝试从web浏览器与服务器上的CLI交互。在服务器端,我使用的是运行在JBoss AS 7.1.1.Final上的Java Servlet。CLI是一个ovirt引擎工具()。为了使用它,您必须在它请求时提供RESTAPI密码 因此,下面是我用来与CLI交互的代码: private String executeCommand(String command) { System.out.println("Executing command: " + command); St

我正在尝试从web浏览器与服务器上的CLI交互。在服务器端,我使用的是运行在JBoss AS 7.1.1.Final上的Java Servlet。CLI是一个ovirt引擎工具()。为了使用它,您必须在它请求时提供RESTAPI密码

因此,下面是我用来与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的文档)

因此,执行在这里被阻止,因为CLI正在等待密码,Servlet无法看到行
,请为admin@internaloVirt引擎用户(按CTRL+D组合键中止):
因为它没有发送到
[stdout]
。但是,如果我直接在终端中手动输入密码,则可以正常工作

因此,我的问题是如何从CLI读取密码请求并回答它


谢谢您的时间。

我建议使用缓冲读卡器是错误的,因为它可能正在等待提示符末尾的换行符,而提示符不在那里,因此无法返回换行符

我想你得直接读这条流。可能是逐字符或逐字节

也可能不需要等待提示。在unix shell编程中,通常提供标准输入而不引用提示符,如:

Command <!
Lineone
line two
!

命令您可能希望检查类似于“expect”功能的库,请参阅。。。仅使用Java的“内置”功能自己执行此操作可能会变得很困难。您确定您的if条件为真吗?你能在里面印个字确认一下吗?@Jägermeister谢谢我会看看的。但是,您知道为什么密码请求不在
[stdout]
中吗?@assylias由于Servlet从未读取密码请求,因此if条件从不为true。因此,
从不包含以下句子:
请为admin@internaloVirt引擎用户(按CTRL+D组合键中止):
这是我不明白的问题。有这个问题(我正在运行svn命令,需要输入密码)。你找到原因了吗?你是怎么处理的?
Command <!
Lineone
line two
!