Использование скриптов expect в ОС Linux

Использование скриптов expect в ОС Linux

Рубрики:

Linux, Утилиты Linux

Метки:

Bash, linux

Утилита expect — инструмент, который предназначен для автоматизации взаимодействия с интерактивными программами в Unix-подобных операционных системах, включая Linux. Она часто используется для решения задач, требующих пользовательского ввода, применения команд telnet, ftp, passwd, ssh и так далее.

В этой статье мы покажем, как использовать скрипты expect в ОС Linux.

Содержание:

  1. Установка и синтаксис команды expect в Linux
  2. Отличие скриптов expect от сценариев Bash в Linux
  3. Скрипт expect для получения ответов на вопросы
  4. Использование переменных в скриптах expect
  5. Изменение пароля от учетной записи пользователя с помощью скрипта expect
  6. Использование инструмента autoexpect
  7. Выводы

Установка и синтаксис команды expect в Linux

Инструмент expect доступен для установки из стандартных репозиториев большинства популярных дистрибутивов Linux. Поэтому для его инсталляции достаточно выполнить одну из следующих команд.

Для Debian / Ubuntu:

 

install

Для 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 и вставим в него следующий код:

 

sh script 1

Сохраним внесенные изменения, закроем файл и сделаем его исполняемым:

 

Затем создадим скрипт expect_response.exp и напишем в нем следующий код:

 

expect script 1

Давайте детальнее разберем команды из этого кода:

  • 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:

 

run expect script 1

Скрипт expect_response.exp запускает сценарий interactive_script.sh и автоматически отправляет заранее написанные ответы.

Читайте также: Написание скриптов в AWK.

Использование переменных в скриптах expect

Как мы сказали ранее, утилита expect имеет ключевое слово set, которое позволяет создавать переменные. Вы можете вручную присвоить значение определенной переменной. Чтобы это сделать, используйте в скрипте следующую команду:

 

Или же Вы можете присваивать значения для переменной с помощью стандартного ввода:

 

Где:

  • lindex — команда, которая извлекает значения из стандартного ввода по указанному индексу;
  • $argv — переменная, которая содержит аргументы командной строки, переданные сценарию;
  • <argument-number> — позиция аргумента командной строки, значение которого нужно записать в переменную.

Важно: нумерация индексов аргументов начинается с 0.

Для примера давайте также воспользуемся скриптом interactive_script.sh и отправим автоматические ответы на его вопросы. Только в этот раз в коде сценария expect_response.exp применим переменные:

 

expect script vars

Как вы могли заметить, мы изначально задали значения для переменных NAME и COLOR. А значение для переменной NUMBER мы передадим с помощью стандартного ввода.

Запустим скрипт expect_response.exp и передадим в качестве значения NUMBER число 31:

 

run expect script vars

Изменение пароля от учетной записи пользователя с помощью скрипта expect

Кроме переменных, Вы также можете использовать команды Linux в скриптах expect. Для примера напишем скрипт expect_response.exp, с помощью которого можно изменять пароли пользователей Linux:

 

expect script with commands

Читайте также: Как запустить 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!:

 

run expect script with commands

На скриншоте выше видно, что мы успешно изменили пароль.

Использование инструмента autoexpect

Утилита autoexpect входит в состав пакета инструмента expect. Она позволяет автоматически создавать сценарии expect на основе взаимодействия с целевой командой или интерактивной программой.

В качестве примера возьмем скрипт interactive_script.sh, в котором мы задавали вопросы пользователю, и запустим его с помощью команды autoexpect:

 

autoexpect usage

Нам пришлось вручную прописывать ответы на вопросы в интерактивном режиме. На основе внесенных данных утилита autoexpect сформировала скрипт script.exp. Просмотрим его содержимое с помощью текстового редактора nano:

 

autoexpect script

Читайте также: Установка и использование утилиты ShellCheck в Linux.

Выводы

Мы показали Вам базовую структуру скриптов expect и несколько практических примеров их использования в ОС Linux. Вы можете применять сценарии expect в различных ситуациях, например, для автоматизации и тестирования кода.

Спасибо за время, уделенное прочтению статьи!

Если возникли вопросы — задавайте их в комментариях.

Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!

Чтобы знать больше и выделяться знаниями среди толпы IT-шников, записывайтесь на курсы Ciscoкурсы по кибербезопасностиполный курс по кибербезопасностикурсы DevNet / DevOps (программируемые системы) от Академии Ciscoкурсы Linux от Linux Professional Institute на платформе SEDICOMM University (Университет СЭДИКОММ).

Курсы Cisco, Linux, кибербезопасность, DevOps / DevNet, Python с трудоустройством!

Спешите подать заявку! Группы стартуют 25 января, 26 февраля, 22 марта, 26 апреля, 24 мая, 21 июня, 26 июля, 23 августа, 20 сентября, 25 октября, 22 ноября, 20 декабря.
Что Вы получите?
  • Поможем стать экспертом по сетевой инженерии, кибербезопасности, программируемым сетям и системам и получить международные сертификаты Cisco, Linux LPI, Python Institute.
  • Предлагаем проверенную программу с лучшими учебниками от экспертов из Cisco Networking Academy, Linux Professional Institute и Python Institute, помощь сертифицированных инструкторов и личного куратора.
  • Поможем с трудоустройством и стартом карьеры в сфере IT — 100% наших выпускников трудоустраиваются.
Как проходит обучение?
  • Проведем вечерние онлайн-лекции на нашей платформе.
  • Согласуем с вами удобное время для практик.
  • Если хотите индивидуальный график — обсудим и реализуем.
  • Личный куратор будет на связи, чтобы ответить на вопросы, проконсультировать и мотивировать придерживаться сроков сдачи экзаменов.
  • Всем, кто боится потерять мотивацию и не закончить обучение, предложим общение с профессиональным коучем.
А еще поможем Вам:
  • отредактировать или создать с нуля резюме;
  • подготовиться к техническим интервью;
  • подготовиться к конкурсу на понравившуюся вакансию;
  • устроиться на работу в Cisco по специальной программе. Наши студенты, которые уже работают там: жмите на #НашиВCisco Вконтакте, #НашиВCisco Facebook.
Чтобы учиться на курсах Cisco, Linux LPI, кибербезопасность, DevOps / DevNet, Python, подайте заявку или получите бесплатную консультацию.

Рубрики:

Linux, Утилиты Linux

Метки:

Bash, linux

Больше похожих постов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения


Поиск по сайту
Лучшее
Популярное
Рубрики