Я использовал библиотеку Java ExpectJ для автоматизации некоторых заданий на сервере Linux, однако теперь мне нужно автоматизировать задание, которое отправляет разный текстовый ответ для каждого выполнения. Вот вывод:
Last unsuccessful login: Fri Mar 30 15:21:31 CST 2012
********************************************************************************
********************************************************************************
[YOU HAVE NEW MAIL]
local-login [/home/user]%
А в моем коде есть следующее:
s.expect("Login as:");
s.send("userlogin\n");
s.expect("userlogin@iphost's password:");
s.send("password\n");
Я получил показанный вывод, но не смог отправить следующую команду, потому что не знаю, как прочитать последний ответ. Я попытался использовать регулярное выражение, но оно не работает.
решение1
Предшествующий текст баннера не нужно обрабатывать. Expect будет ждать, пока не будет выполнено одно из условий (например, совпадение со строкой/регулярным выражением или истечение времени ожидания). Текст перед ним буферизуется для возможного использования в будущем, но не является частью совпадения. Вам нужно обработать поиск строки приглашения: local-login [/home/user]%
. Если у вас есть хорошее представление о том, как это может выглядеть (например, всегда будет иметь '[' каталог ']%'), то вы можете написать регулярное выражение для сопоставления с этим:
.*\[(/[^/]+)+\]%
Убедитесь, что в регулярном выражении нет символов новой строки/возврата каретки, поскольку в выходных данных их не будет.
решение2
Я не думаю, что вы можете использовать регулярные выражения для сопоставленияОжидатьJ.
Кажетсякак будто они рассчитывают String.indexOf
найти совпадение
if (line.toString().trim().toUpperCase().indexOf(pattern.toUpperCase()) != -1)
где pattern
указана ожидаемая строка.
Поэтому попробуйте вместо этого выполнить сопоставление по подстроке и посмотрите, сработает ли это лучше.