Вопросы ожидаемого взаимодействия должны обеспечивать ожидания для нескольких условий
Вопрос новичка 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 внутри лямбда-функции.