如何将参数传递给Java Process?

时间:2014-08-16 09:53:38

标签: java

我有一个创建并运行进程(x.exe)的Java应用程序。执行进程x时,会提示用户输入密码。如何将此密码传递给用户?

我尝试使用该进程的OutputStream并将密码写入流,但仍然没有运行该进程。

Runtime r=Runtime.getRuntime();
Process p=r.exec("x.exe");
p.getOutputStream()//.use to pass the arguments

3 个答案:

答案 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();

一些警告:

  • 最终在Linux中使用'\ n',也许在Windows中你需要\ r \ n(老实说,我不确定Windows如何在输入中处理“ENTER”键)
  • 我正在使用"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这样的库与外部流程进行交互