我有一个创建并运行进程(x.exe)的Java应用程序。执行进程x时,会提示用户输入密码。如何将此密码传递给用户?
我尝试使用该进程的OutputStream
并将密码写入流,但仍然没有运行该进程。
Runtime r=Runtime.getRuntime();
Process p=r.exec("x.exe");
p.getOutputStream()//.use to pass the arguments
答案 0 :(得分:2)
您需要刷新流,并且,它可能希望密码末尾的CR模拟用户在密码末尾键入的ENTER键。这适用于Linux:
Runtime r = Runtime.getRuntime();
Process p = r.exec("myTestingExe");
p.getOutputStream().write("myPassword\n".getBytes()); // notice the `\n`
p.getOutputStream().flush();
一些警告:
"myPassword\n".getBytes()
,但如果您使用的是“UTF-8”等编码,则更完整的值为new String("myPassword".getBytes(), Charset.forName("MyCharsetName"));
(其中“MyCharsetName”是受支持的编码)。答案 1 :(得分:2)
正如已经指出的那样,您可以考虑使用类似Expect的库来在Java程序和生成的OS进程之间进行交互。基本上,您需要等到密码提示在流程输入流中可用,然后将行尾输出的密码写入流程输出流。
如果您决定采用第三方图书馆方法,我建议您尝试使用我自己的现代替代expect4j和其他人。它被称为ExpectIt没有依赖关系,并且是Apache许可的。
以下是使用expect库的可能示例:
Process process = Runtime.getRuntime().exec("...");
Expect expect = new ExpectBuilder()
.withInputs(process.getInputStream())
.withOutput(process.getOutputStream())
.withErrorOnTimeout(true)
.build();
expect.expect(contains("Password:"));
expect.sendLine("secret");
expect.close();
注意:contains
方法是静态导入的。
答案 2 :(得分:0)
您可以尝试像expect4j这样的库与外部流程进行交互