Вопросы ожидаемого взаимодействия должны обеспечивать ожидания для нескольких условий

Вопрос новичка Java,

Я пытаюсь перевести некоторые из моих сценариев с Perl на Java, и мне повезло, что я нашел ответы в примерах здесь, но этот поставил меня в тупик. Я безуспешно пытался продублировать поведение, аналогичное сценарию Perl, используя модуль ожидаемого.

$exp->spawn("ssh -l $username $dev_ip\n");
$exp->expect(15,
   [ qr/ssh -l $username $dev_ip\r/ => sub { exp_continue; } ],
   [ qr/\(yes\/no\)\?\s*$/ => sub { $exp->send("yes\n"); exp_continue; } ],
   [ qr/[Pp]assword:\s*$/ => sub {$exp->send("$password\n");exp_continue;}],
   [ qr/User/ => sub { $exp->send("$username\n"); exp_continue;} ],
   [ qr/Press any key to continue/ => sub {$exp->send("\n");exp_continue;}],
   [ qr/$prompt/i => sub { $exp->send("\n");],);

Вышеуказанное время истекает через 15 секунд, если строка подсказки никогда не достигается. Он также имеет несколько условий, которые он мог видеть и отвечать на них при попытке войти в систему, вызывая подпрограммы.

Я думаю, основываясь на том, что я прочитал, что мне нужно использовать взаимодействие, как в следующем примере, но я не совсем уверен, что лямбда здесь делает. Может ли кто-нибудь предоставить более подробные сведения?

expect.interact()
    .when(contains("abc")).then(r -> System.out.println("A"))
    .when(contains("xyz")).then(r -> System.err.println("B"))
    .until(contains("exit"));
    System.out.println("DONE!");

Я подозреваю, что мне нужен пример ответа на приглашения во время нахождения в цикле взаимодействия и, возможно, оборачивания всего взаимодействия в некоторый тип таймера для обеспечения действия по умолчанию, если ничего не приводит к приглашению войти в систему.

Я смотрел на

expect.expect(anyOf(contains("string"), regexp("abc.*def")));

но не думал, что это удовлетворит мои потребности, потому что я не вижу способа ответить на матч, продолжая искать других.

1 ответ

Я думаю, что можно копировать функциональность с помощью взаимодействия в ExpectIt. Лямбды в приведенном выше примере выводят некоторый текст в стандартный поток вывода, когда пользователь вводит определенную строку.

Вы можете получить доступ к экземпляру "ожидаемо" внутри лямбда-функции для отправки команд или запуска нового интерактивного цикла.

Вот как примерно может выглядеть эквивалентный Java-код:

        expect.withTimeout(15, TimeUnit.SECONDS)
                .interact()
                .when(regexp("\\(yes\\/no\\)\\?\\s*$"))
                        .then(r -> expect.sendLine("yes"))
                .when(regexp("User")).then((r) -> expect.sendLine("$user"))
                .when(regexp("[Pp]assword")).then((r) -> expect.sendLine("$password"))
                .when(contains("Press any key to continue")).then((r) -> expect.sendLine())
                .until(regexp("$prompt"));

Обратите внимание, что в версии 0.8.1 и ниже вы должны обрабатывать проверенное IOException внутри лямбда-функции.

Другие вопросы по тегам