3.9.8.10 expect - инструмент для автоматизации и тестирования
Скачать документ Окружение
- Версия РЕД ОС: 8
- Конфигурация: Рабочая станция
- Версия ПО: expect-5.45.4-1
Expect — инструмент для автоматизации и тестирования, входящий в состав РЕД ОС. Предназначен для интерактивных приложений, таких как telnet, ftp, passwd, fsck, rlogin, tip, ssh и других.
Для установки expect перейдите в сеанс пользователя root:
su -
и выполните команду:
dnf install expect
Для проверки работоспособности инструмента будет создан небольшой bash-скрипт, которому потребуется взаимодействие с пользователем. Для примера скрипт будет назван questions.
nano ./questions #!/bin/bash echo "Hello, what's your name?" read $REPLY echo "Can I ask you some question?" read $REPLY echo "What's your favorite OS?" read $REPLY
Затем будет создан expect-скрипт, который запустит скрипт questions и ответит на его вопросы:
nano ./answerbot #!/usr/bin/expect -f set timeout -1 spawn ./questions expect "Hello, what's your name?\r" send -- "Im Dmitry\r" expect "Can I ask you some question?\r" send -- "Sure\r" expect "What's your favorite OS?\r" send -- "RedOS\r" expect eof
В начале скрипта находится строка идентификации, которая (в данном примере) содержит путь к expect, т. к. интерпретацией скрипта будет заниматься именно expect. Во второй строке отключается тайм-аут путем присвоения переменной timeout значения -1. Остальная часть кода – это и есть автоматизация работы с bash-скриптом.
Сначала с помощью команды spawn запускается bash-скрипт с указанием пути к нему. Вместо пути к скрипту можно указать любую другую утилиту командной строки. Далее задана последовательность вопросов, поступающих от bash-скрипта, и ответов, которые дает expect-скрипт. Получив вопрос от подпроцесса, expect выдает ему заданный ответ и ожидает получения следующего вопроса.
В последней строке expect ожидает признака конца файла и скрипт, выполнив все действия до этой команды, завершается.
Рассмотрим данный пример на практике. Назначим скриптам права на исполнение с помощью команд:
chmod +x ./answerbot chmod +x ./questions
и вызовем answerbot:
./answerbot spawn ./questions Hello, what's your name? Im Dmitry Can I ask you some question? Sure What's your favorite OS? RedOS
Обратите внимание, что после запуска скрипта answerbot всё происходит полностью в автоматическом режиме. То же самое можно проделать для любой утилиты командной строки. Здесь необходимо отметить, что bash-скрипт в примере устроен очень просто, мы точно знаем, какие именно данные он выводит, поэтому написать expect-скрипт для взаимодействия с ним несложно.
Задача усложняется при работе с программами, которые написаны другими разработчиками. Однако здесь на помощь приходит средство для автоматизированного создания expect-скриптов.
Autoexpect — автоматизированное создание expect-скриптов
Autoexpect позволяет запускать программы, которые необходимо автоматизировать, после чего записывает то, что они выводят, и то, что пользователь вводит, отвечая на их вопросы. Вызовем autoexpect для нашего скрипта командой:
autoexpect ./questions autoexpect started, file is script.exp Hello, what's your name? Dmitry Can I ask you some question? Sure What's your favorite OS? RED OS autoexpect done, file is script.exp
В этом режиме взаимодействие с bash-скриптом ничем не отличается от обычного – мы сами вводим ответы на его вопросы.
После завершения работы с bash-скриптом autoexpect сообщит о том, что собранные данные записаны в файл script.exp. Проверим содержимое этого файла.
cat ./script.exp set timeout -1 spawn ./questions match_max 100000 expect -exact "Hello, what's your name?\r " send -- "Dmitry\r" expect -exact "Dmitry\r Can I ask you some question?\r " send -- "Sure\r" expect -exact "Sure\r What's your favorite OS?\r " send -- "RED OS\r" expect eof
В целом, за исключением некоторых деталей, перед нами такой же скрипт, который мы написали самостоятельно. Если запустить этот скрипт, результат будет тем же.
Таким образом, можно автоматизировать работу практически любого bash-скрипта.
Дата последнего изменения: 25.09.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.