0

当我在执行之间从命令提示符执行该命令时,我有一个用于构建过程的 ant 命令,它提示我输入一些密码,当我输入密码并按回车键时,它会继续执行并给我成功的消息。

现在我想使用 Runtime.execute(...); 以编程方式在 java 中做同样的事情;并且在提示密码之前它工作正常(我正在阅读命令提示符的输出)但是我不知道如何在 cmd 输出提示输入密码时显示一个对话框,我可以在其中输入我的密码并使用该密码我程序继续执行并成功完成。我想从命令提示符处手动做同样的事情。

所以问题是是否可以在 Runtime.execute 执行命令之间输入参数,如果是的话,如何通过参数恢复命令执行?

这是一个简单的 Swing 应用程序,它正在执行命令,我想使用 Swing Ui 对话框来获取密码。

按照 Andy Thomas 的建议更新了我的代码:

Process p1 =Runtime.getRuntime().exec("cmd /C my command", null, myProject);
BufferedReader in = new BufferedReader(  
                            new InputStreamReader(p1.getInputStream()));  
String line = null;  

while ((line = in.readLine()) != null) {  
   System.out.println(line);
   if(line.contains("Please enter password")){
       System.out.println("Prompting for password ");
       OutputStream child_stdin = p1.getOutputStream();
       BufferedWriter child_writer = new BufferedWriter(new OutputStreamWriter( child_stdin ));
       child_writer.write( "password123" );
        child_writer.flush();

            }

        }  

    }

但没有奏效。

4

2 回答 2

1

当你调用 时Runtime.exec(),你会得到一个代表子进程的 Process 对象。

  1. 从子进程的输出流中读取——由Process.getInputStream()提供——直到检测到密码请求。
  2. 询问用户密码,最好使用JPasswordField以便隐藏密码。
  3. 将密码提供给Process.getOutputStream()提供的进程输入流。
  4. 继续从子进程的输出流中读取,否则子进程可能会阻塞。

编辑:这是您将如何写入String userPassword子进程的草图(未经测试),正如您在下面的评论中所要求的那样。... 省略了从子进程的输出流中读取的部分,否则子进程可能会阻塞。

    Process process = Runtime.getRuntime().exec("...");
    ...
    OutputStream child_stdin = process.getOutputStream();
    BufferedWriter child_writer = new BufferedWriter(new OutputStreamWriter( child_stdin ));
    child_writer.write( userPassword );
    child_writer.newLine();  // suggested by OP
    child_writer.flush();
于 2013-07-15T20:01:18.603 回答
1

作为替代方案,ant从安全文件中加载密码,如此此处所示。

于 2013-07-15T21:34:29.577 回答