如何使用runtime.getRuntime处理交互式命令?

时间:2018-04-06 16:01:43

标签: java runtime.exec

我必须在Unix平台上从Java程序执行命令。 我正在使用Runtime.getRuntime()

然而,问题是我的命令是交互式的,并在运行时询问某些参数。例如,命令是createUser。它要求userName作为运行时。

bash-4.1$ createUser  

Enter the UserName:

如何处理这样的场景,以便在运行时从Java程序输入用户名?

try {
    Process proc;
    proc = Runtime.getRuntime().exec(cmd, envp);
    BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));

    BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

    // read the output from the command
    String s = null;
    while ((s = stdInput.readLine()) != null) {
        System.out.println(s);
        sb.append(s);
    }

    // read any errors from the attempted command
    while ((s = stdError.readLine()) != null) {
        System.out.println(s);
        sb.append(s);
    }
} catch (Exception e) {
    e.printStackTrace();
    sb = null;
}

我听说可以通过期待完成。但是我怎么能用Java做呢?

2 个答案:

答案 0 :(得分:0)

从proc获取standardOutput。您在该standardOutput中编写的所有内容都将转到命令

将用户名发送到standardOutput并且不要忘记发送\ n。

答案 1 :(得分:0)

您可以检查输入流的最后一行是什么,当您检测到用户输入输入的提示时,请将输出值写入您的值。

try {
    Process proc;
    proc = Runtime.getRuntime().exec(cmd, envp);

    final BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));

    final PrintWriter stdOutput = new PrintWriter(proc.getOutputStream());

    // read the output from the command
    String s = null;
    while ((s = stdInput.readLine()) != null) {
        System.out.println(s);

        if (s.equals("Enter your username")) {
            stdOutput.println("MyUsername");
            stdOutput.flush();
        }

        sb.append(s);
    }

} catch (final Exception e) {
    e.printStackTrace();
    sb = null;
}

(为简单起见,删除了错误流)

请注意,如果提示以新行结尾,则

如果提示没有新行(例如Username: <cursor here>),您可以尝试在开头写入值:

    ...
    final PrintWriter stdOutput = new PrintWriter(proc.getOutputStream());
    stdOutput.println("MyUsername");
    stdOutput.flush();
    ...

但是如果该命令清除缓冲区,则无效,在这种情况下(极少数情况下),您必须更改从流中读取的方式(例如,而不是行,读取字节)