Java: обнаружение приглашения пользователя при запуске пакетного скрипта из Java - PullRequest
5 голосов
/ 15 декабря 2010

Мне нужно выполнить из Java пакетный скрипт, который выполняет следующие действия:

1) После запуска он выполняет длительную (до нескольких секунд) задачу.

2) После этого,он отображает приглашение «Пароль:».

3) Затем пользователь вводит пароль и нажимает клавишу ввода.

4) Затем сценарий завершает свою работу.

Я знаю, как запустить скрипт из Java, я знаю, как прочитать выходные данные пакетного скрипта в Java, но я не знаю, как ждать появления запроса пароля (как узнать, что пакетскрипт ожидает ввода пароля).

Итак, мой вопрос: как узнать, когда пакетный скрипт напечатал подсказку?

На данный момент у меня есть следующий код:

final Runtime runtime = Runtime.getRuntime();
final String command = ... ;

final Process proc = runtime.exec(command, null, this.parentDirectory);

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

String line = null;

while ((line = input.readLine()) != null) {
 LOGGER.debug("proc: " + line);
}

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

Это должно сделать работу:

  public static void main(final String... args) throws IOException, InterruptedException {
    final Runtime runtime = Runtime.getRuntime();
    final String command = "..."; // cmd.exe

    final Process proc = runtime.exec(command, null, new File("."));

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

    StringBuilder sb = new StringBuilder();
    char[] cbuf = new char[100];
    while (input.read(cbuf) != -1) {
        sb.append(cbuf);
        if (sb.toString().contains("Password:")) {
            break;
        }
        Thread.sleep(1000);
    }
    System.out.println(sb);
}
2 голосов
/ 15 декабря 2010

Кажется, этот работает:

@Override
public void run() throws IOException, InterruptedException {
    final Runtime runtime = Runtime.getRuntime();
    final String command = ...;

    final Process proc = runtime.exec(command, null, this.parentDirectory);

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

    String batchFileOutput = "";

    while (input.ready()) {
        char character = (char) input.read();
        batchFileOutput = batchFileOutput + character;
    }

    // Batch script has printed the banner
    // Wait for the password prompt
    while (!input.ready()) {
        Thread.sleep(1000);
    }

    // The password prompt isn't terminated by a newline - that's why we can't use readLine.
    // Instead, we need to read the stuff character by character.
    batchFileOutput = "";

    while (input.ready() && (!batchFileOutput.endsWith("Password: "))) {
        char character = (char) input.read();
        batchFileOutput = batchFileOutput + character;
    }

    // When we are here, the prompt has been printed
    // It's time to enter the password

    if (batchFileOutput.endsWith("Password: ")) {
        final BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(proc.getOutputStream()));

        writer.write(this.password);

        // Simulate pressing of the Enter key
        writer.newLine();

        // Flush the stream, otherwise it doesn't work
        writer.flush();
    }

    // Now print out the output of the batch script AFTER we have provided it with a password
    String line;

    while ((line = input.readLine()) != null) {
        LOGGER.debug("proc: " + line);
    }

    // Print out the stuff on stderr, if the batch script has written something into it
    final BufferedReader error = new BufferedReader(new InputStreamReader(
            proc.getErrorStream()));

    String errorLine = null;

    while ((errorLine = error.readLine()) != null) {
        LOGGER.debug("proc2: " + errorLine);
    }

    // Wait until the program has completed

    final int result = proc.waitFor();

    // Log the result
    LOGGER.debug("result: " + result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...