使用Runtime.getRuntime()。exec(command)时,用户对命令行的输入;

时间:2012-12-12 17:02:10

标签: java command-line execute

我不认为这是可能的,但我一直在使用:

Process p = Runtime.getRuntime().exec(command);

在命令行上运行命令,但现在我遇到了一个情况,即我正在运行的命令会询问一些用户输入,例如用户名。

这不能通过作为exec的命令的参数来解决,是否有任何方法可以将用户名传递给同一命令行实例并继续?

--- --- EDIT

我仍然无法让这个工作。这些是命令行上的步骤:

C:\someProgram.exe
Login:
Passowrd:

所以我需要在运行时提示时传递登录名和密码。我得到的代码不起作用:

try {
        String CMD = "\"C:\\someProgram\"";
        Scanner scan = new Scanner(System.in);
        ProcessBuilder builder = new ProcessBuilder(CMD);
        builder.redirectErrorStream(true);
        Process process = builder.start();

        InputStream is = process.getInputStream();
        BufferedReader reader = new BufferedReader (new InputStreamReader(is));
        OutputStream out = process.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
        String line;
        try {
            while (scan.hasNext()) {
                String input = scan.nextLine();
                if (input.toLowerCase().startsWith("login")) {
                    writer.write("myUsername");
                } else if(input.toLowerCase().startsWith("password")){
                    writer.write("myPassword");
                }
                writer.flush();

                line = reader.readLine();
                while (line != null) {
                    System.out.println ("Stdout: " + line);
                    line = reader.readLine();
                }
                if (line == null) {
                    break;
                }
            }
            process.waitFor();
        }
        finally {;
            writer.close();
            reader.close();
        }
    }
    catch (Exception err) {
        System.err.println("some message");
    }

我尝试过这样的事情:     writer.write( “名为myUsername \ n”);

任何帮助,我都可以看到someProgram.exe在进程中被调用并运行,但它只是挂起。

3 个答案:

答案 0 :(得分:3)

只需写入p.getOutputStream()即可。那会将用户名发送到进程的标准输入,这应该做你想要的。

out = p.getOutputStream();
out.write("fooUsername\n".getBytes());
out.flush();

答案 1 :(得分:0)

您应该重定向命令输入并将参数发送到那里。使用process.setInputStream(),写入此流。

答案 2 :(得分:0)

作为command字符串的一部分,如果您在Unix / Linux / OSX和可能 PowerShell上运行,则可以在cat shell命令前加上shell转储将文件的内容放入输入流中,以便将预期的可执行文件读作输入。

类似cat user_input.txt | myAppWantsInput.pl的命令。

这将取user_input.txt的内容,将其转换为标准输入,因此当command中的“myAppWantsInput.pl”执行,并从标准输入读取时,它将读取该文件的内容并将其作为输入,就像从键盘输入一样。

当然,你不知道先验你打算传递什么值,你可以在调用命令之前动态生成你需要的文件。如果在运行命令之前无法确定所需的所有输入,则无法使用此功能。