Утилита expect — инструмент, который предназначен для автоматизации взаимодействия с интерактивными программами в Unix-подобных операционных системах, включая Linux. Она часто используется для решения задач, требующих пользовательского ввода, применения команд telnet, ftp, passwd, ssh и так далее.
В этой статье мы покажем, как использовать скрипты expect в ОС Linux.
Содержание:
- Установка и синтаксис команды expect в Linux
- Отличие скриптов expect от сценариев Bash в Linux
- Скрипт expect для получения ответов на вопросы
- Использование переменных в скриптах expect
- Изменение пароля от учетной записи пользователя с помощью скрипта expect
- Использование инструмента autoexpect
- Выводы
Установка и синтаксис команды expect в Linux
Инструмент expect доступен для установки из стандартных репозиториев большинства популярных дистрибутивов Linux. Поэтому для его инсталляции достаточно выполнить одну из следующих команд.
Для Debian / Ubuntu:
Для CentOS / RHEL:
Для Fedora:
Для взаимодействия с другими инструментами, утилита expect использует следующие ключевые слова:
spawn— инициирует новый процесс, обычно интерактивную программу или оболочку;send— отправляет текст или команды запущенному процессу;interact— позволяет вручную взаимодействовать с запущенным процессом;set— присваивает значения переменным;sleep— устанавливает задержку;exp_continue— используется для продолжения сопоставления шаблонов и выполнения последующих команд;exit— завершает скриптexpect;eof— означает конец запущенного процесса;timeout— устанавливает время ожидания для команд.
Читайте также: 10 полезных советов для написания эффективных bash скриптов в Linux.
Отличие скриптов expect от сценариев Bash в Linux
Сценарии expect и скрипты Bash имеют схожую структуру. Но есть одно важное отличие: в первой строке (shebang) вместо пути к Bash указывается путь к интерпретатору expect:
Также скрипты expect имеют расширение *.exp.
Скрипт expect для получения ответов на вопросы
К примеру, давайте напишем скрипт Bash, в котором попросим пользователя дать ответы на некоторые вопросы. Для этого создадим файл interactive_script.sh и вставим в него следующий код:
Сохраним внесенные изменения, закроем файл и сделаем его исполняемым:
Затем создадим скрипт expect_response.exp и напишем в нем следующий код:
Давайте детальнее разберем команды из этого кода:
spawn ./interactive_script.sh— запускает новый процесс, в данном случае — интерактивный сценарий оболочкиinteractive_script.sh;expect "Hello, who is this?\r"— ожидает получения указанного шаблона (символ\rобозначает конец строки);send -- "SEDICOMM\r"— отправляет строкуSEDICOMM, что имитирует предоставление ввода интерактивному сценарию;expect "What's your favorite color?\r"— ожидает получения указанного шаблона в выводе интерактивного сценария;send -- "Blue\r"— отправляет строкуBlueдля ответа на вопрос;expect "How old are you?\r"— ожидает указанный шаблон в выводе интерактивного сценария;send -- "31\r"— отправляет строку31для ответа на соответствующий вопрос;expect eof— обозначает конец взаимодействия двух скриптов.
Также сохраним внесенные изменения, закроем файл и сделаем его исполняемым:
После чего запустим скрипт expect_response.exp с помощью команды expect:
Скрипт expect_response.exp запускает сценарий interactive_script.sh и автоматически отправляет заранее написанные ответы.
Читайте также: Написание скриптов в AWK.
Использование переменных в скриптах expect
Как мы сказали ранее, утилита expect имеет ключевое слово set, которое позволяет создавать переменные. Вы можете вручную присвоить значение определенной переменной. Чтобы это сделать, используйте в скрипте следующую команду:
Или же Вы можете присваивать значения для переменной с помощью стандартного ввода:
Где:
lindex— команда, которая извлекает значения из стандартного ввода по указанному индексу;$argv— переменная, которая содержит аргументы командной строки, переданные сценарию;<argument-number>— позиция аргумента командной строки, значение которого нужно записать в переменную.
Важно: нумерация индексов аргументов начинается с 0.
Для примера давайте также воспользуемся скриптом interactive_script.sh и отправим автоматические ответы на его вопросы. Только в этот раз в коде сценария expect_response.exp применим переменные:
Как вы могли заметить, мы изначально задали значения для переменных NAME и COLOR. А значение для переменной NUMBER мы передадим с помощью стандартного ввода.
Запустим скрипт expect_response.exp и передадим в качестве значения NUMBER число 31:
Изменение пароля от учетной записи пользователя с помощью скрипта expect
Кроме переменных, Вы также можете использовать команды Linux в скриптах expect. Для примера напишем скрипт expect_response.exp, с помощью которого можно изменять пароли пользователей Linux:
Читайте также: Как запустить PHP-скрипт в Linux.
Давайте разберем команды из этого кода:
set USER [lindex $argv 0]— устанавливает переменнуюUSERсо значением первого аргумента командной строки, переданного сценарию;set PASS [lindex $argv 1]— устанавливает переменнуюPASSсо значением второго аргумента командной строки;set timeout 1— задает таймаут в 1 секунду;spawn passwd $USER— запускает процесс командыpasswdдля указанного пользователя, имя которого хранится в переменнойUSER;expect -exact "Enter new UNIX password: "— ожидает точное совпадение с указанным шаблоном в выводе запущенного процесса;send -- "$PASS\r"— отправляет пароль, который хранится в переменнойPASS, в запущенный процесс;expect -exact "Retype new UNIX password: "— ожидает точное совпадение с указанным шаблоном в выводе запущенного процесса;send -- "$PASS\r"— отправляет пароль еще раз для подтверждения;expect eof— ожидает завершения запущенного процесса.
Для примера изменим пароль для пользователя myuser. Запустим скрипт expect_response.exp с аргументами myuser и some_password1!:
На скриншоте выше видно, что мы успешно изменили пароль.
Использование инструмента autoexpect
Утилита autoexpect входит в состав пакета инструмента expect. Она позволяет автоматически создавать сценарии expect на основе взаимодействия с целевой командой или интерактивной программой.
В качестве примера возьмем скрипт interactive_script.sh, в котором мы задавали вопросы пользователю, и запустим его с помощью команды autoexpect:
Нам пришлось вручную прописывать ответы на вопросы в интерактивном режиме. На основе внесенных данных утилита autoexpect сформировала скрипт script.exp. Просмотрим его содержимое с помощью текстового редактора nano:
Читайте также: Установка и использование утилиты ShellCheck в Linux.
Выводы
Мы показали Вам базовую структуру скриптов expect и несколько практических примеров их использования в ОС Linux. Вы можете применять сценарии expect в различных ситуациях, например, для автоматизации и тестирования кода.
Спасибо за время, уделенное прочтению статьи!
Если возникли вопросы — задавайте их в комментариях.
Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!
Чтобы знать больше и выделяться знаниями среди толпы IT-шников, записывайтесь на курсы Cisco, курсы по кибербезопасности, полный курс по кибербезопасности, курсы DevNet / DevOps (программируемые системы) от Академии Cisco, курсы Linux от Linux Professional Institute на платформе SEDICOMM University (Университет СЭДИКОММ).
Курсы Cisco, Linux, кибербезопасность, DevOps / DevNet, Python с трудоустройством!
- Поможем стать экспертом по сетевой инженерии, кибербезопасности, программируемым сетям и системам и получить международные сертификаты Cisco, Linux LPI, Python Institute.
- Предлагаем проверенную программу с лучшими учебниками от экспертов из Cisco Networking Academy, Linux Professional Institute и Python Institute, помощь сертифицированных инструкторов и личного куратора.
- Поможем с трудоустройством и стартом карьеры в сфере IT — 100% наших выпускников трудоустраиваются.
- Проведем вечерние онлайн-лекции на нашей платформе.
- Согласуем с вами удобное время для практик.
- Если хотите индивидуальный график — обсудим и реализуем.
- Личный куратор будет на связи, чтобы ответить на вопросы, проконсультировать и мотивировать придерживаться сроков сдачи экзаменов.
- Всем, кто боится потерять мотивацию и не закончить обучение, предложим общение с профессиональным коучем.
- отредактировать или создать с нуля резюме;
- подготовиться к техническим интервью;
- подготовиться к конкурсу на понравившуюся вакансию;
- устроиться на работу в Cisco по специальной программе. Наши студенты, которые уже работают там: жмите на #НашиВCisco Вконтакте, #НашиВCisco Facebook.

































