ubergam3r
ubergam3r

Reputation: 189

User input to the command line when using Runtime.getRuntime().exec(command);

I dont think this is possible, but I have been using:

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

to run commands on the command line, but now I have come accross a situation where the command I am running part way through will ask for some user input, for example a username.

This can not be resolved by a argument to the command that is being exec, is there any way I can pass the username to the same command line instance and continue?

---EDIT---

I still cant get this to work. These are the steps on the command line:

C:\someProgram.exe
Login:
Passowrd:

So I need to pass the login and password when it prompts at runtime. The code I've got that doesnt work:

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");
    }

Ive tried things like: writer.write("myUsername\n");

Any help, i can see that someProgram.exe is called and running in the processes, but it just hangs.

Upvotes: 6

Views: 7269

Answers (3)

Sled
Sled

Reputation: 18939

As part your command String, if you are running on Unix/Linux/OSX and maybe PowerShell, you could prepend the cat shell command to have the shell dump the contents of a file into the input stream for your intended executable to read as input.

A command something like cat user_input.txt | myAppWantsInput.pl.

This will take the content of user_input.txt, dump it into standard-in, so when "myAppWantsInput.pl" in your command executes, and reads from standard-in, it will be reading the contents of the file and taking that as input as if entered from the keyboard.

Of course, it you don't know a priori what values you intend to pass, you could generate the files you need dynamically before invoke the command. This won't work if you can't determine all the input you'll want before you run the command.

Upvotes: 0

javawizard
javawizard

Reputation: 1284

Just write to p.getOutputStream(). That'll send the username to the process's standard input, which should do what you want.

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

Upvotes: 4

AlexR
AlexR

Reputation: 115328

You should redirect the command input and send your parameters there. Use process.setInputStream(), the write into this stream.

Upvotes: 0

Related Questions