Expect – это бесплатная утилита с открытым исходным кодом, которую мы можем использовать для автоматического ответа на интерактивные запросы в соответствии со скриптами, включающими команды expects/sends.
В этом руководстве мы узнаем, как установить expect в наиболее распространенных дистрибутивах Linux, как использовать ее для автоматического ответа на интерактивные запросы и как генерировать скрипты expect с помощью autoexpect.
Установка expect
Хотя expect есть в репозиториях всех основных дистрибутивов Linux, по умолчанию она обычно не установлена.
Чтобы установить утилиту на Fedora и другие дистрибутивы семейства Red Hat, такие как Rocky Linux, мы можем воспользоваться менеджером пакетов dnf:
$ sudo dnf install expect
Чтобы установить пакет на Debian или другие дистрибутивы, основанные на нем, вместо этого мы можем выполнить команду:
$ sudo apt-get update && sudo apt-get install expect
Expect также доступен в репозитории Archlinux «Extra».
Мы можем установить его с помощью pacman:
$ sudo pacman -Sy expect
Пример использования Expect
Некоторые утилиты и программы командной строки, помимо возможности работать в интерактивном режиме, позволяют пользователю передавать необходимые аргументы через специальные опции.
В других случаях, по разным причинам, эти опции отсутствуют: вот тут-то и пригодится expect.
Создавая специальные сценарии expect, мы можем автоматизировать выполнение команд, требующих взаимодействия с пользователем, предоставляя предопределенные ответы на ожидаемые подсказки.
Давайте рассмотрим несколько базовых примеров.
Здесь мы создаем скрипт, который задает некоторый вопрос (имя, страна и адрес электронной почты):
#!/bin/bash
read -p "What is your name? " name
read -p "What is your country? " country
read -p "Enter your email address: " email
Скрипт тривиален, не выполняет никакой проверки данных, но для нашей цели этого достаточно.
Мы сохраняем его под именем «prompts.sh» и даем ему права на выполнение:
$ chmod +x prompts.sh
Как только мы его выполним, как и ожидалось, он предложит нам предоставить запрашиваемую информацию:
$ ./prompts.sh What is your name? Egidio What is your country? Italy Enter your email address: nomail@gmail.com
Как только мы ответим на первую подсказку, созданную скриптом, и нажмем «Enter», появится вторая, и так далее.
Поскольку мы знаем, как выглядят подсказки, мы можем создать скрипт expect, который будет автоматически отвечать на них за нас, без какого-либо взаимодействия. Вот он:
set timeout 20
В приведенном выше примере мы установили тайм-аут в 20 секунд; использование значения -1 полностью отключает тайм-аут, так что expect будет ждать бесконечно, а значение 0 вызывает противоположное поведение: expect не ждет вообще.
Последняя команда, которую мы использовали, – send.
Команда send отправляет процессу строку.
Обратите внимание, что мы включили в строку символ \n (конец строки), поскольку по умолчанию форматирование не применяется.
В последней строке сценария вместо конкретного сообщения мы сопоставили его с EOF (End Of File).
Мы сохраняем скрипт под именем prompts.exp (расширение «.exp» – это просто условность) и делаем его исполняемым.
Наконец, мы запускаем его.
Вот его вывод:
$ ./script.exp spawn ./prompts.sh What is your name? Egidio What is your country? Italy Enter your email address: nomail@gmail.com
Автогенерация скриптов expect с помощью autoexpect
Autoexpect – это утилита, которая поставляется вместе с expect: с ее помощью мы можем генерировать скрипты expect как результат интерактивной сессии.
Вместо того чтобы писать expect-скрипт вручную, мы можем использовать autoexpect для запуска команды, требующей взаимодействия с пользователем, например
$ autoexpect ./prompts.sh
Скрипт , который мы предоставляем в качестве аргумента autoexpect, запускается; он требует нашего взаимодействия, как это обычно и происходит.
Однако после выхода из сценария генерируется сценарий ожидания: script.exp.
При выполнении он воспроизведет действия, которые мы выполняли в интерактивном режиме.
Заключение
В этом руководстве мы познакомились с основами использования expect для автоматизации интерактивных команд. Мы рассмотрели базовый пример написания скрипта expect, используя команды spawn, expect и send.
Наконец, мы увидели, как можно автоматически генерировать сценарий expect с помощью утилиты autoexpect.
Здесь мы едва коснулись поверхности того, чего можно достичь с помощью скриптов expect.
см. также:
- 📜 Что такое IFS в скриптах на Bash?
- 🐍 Как отправить электронное письмо с помощью python на Linux
- 📜 Скрипты Bash: Как заархивировать все файлы в каталоге
- 📜 Как вызвать один скрипт bash из другого скрипта
- 🌐 Формирование логов доступа Nginx для тестирования и анализа
- 🐧 Проверка, содержит ли переменная число на Bash
- Как определить, когда служба была запущена и остановлена, используя журнал systemd