Главная > Среда и утилиты > expect

expect: Автоматизация интерактивных скриптов

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

Обзор

`expect` автоматизирует интерактивные сеансы, ожидая предопределенные шаблоны (например, строки приглашения) и затем отправляя определенные строки (например, ввод пользователя). Это позволяет выполнять сложные задачи без ручного вмешательства.

Основные возможности

  • Расширение языка скриптования на основе Tcl
  • Автоматизация взаимодействия с интерактивными программами (например, ssh, ftp, telnet)
  • Функции сопоставления шаблонов приглашений и отправки ответов
  • Полезно для автоматизации повторяющихся и ручных задач

Основные опции

Опции, управляющие способом выполнения самой команды `expect`. Они отличаются от команд `expect` и `send`, используемых внутри скрипта.

Управление выполнением и отладка

Сгенерированная команда:

Комбинируйте команды.

Описание:

`expect` Запускает команду.

Комбинируйте эти опции, чтобы виртуально выполнять команды с помощью ИИ.

Установка

`expect` обычно не входит в состав большинства дистрибутивов Linux, поэтому его необходимо установить с помощью менеджера пакетов.

Debian/Ubuntu

sudo apt update && sudo apt install expect

Установка `expect` с помощью менеджера пакетов APT.

RHEL/CentOS/Fedora

sudo dnf install expect

Установка `expect` с помощью менеджера пакетов DNF (или Yum).

Примеры использования

Скрипты `expect` обычно имеют расширение `.exp` и начинаются с `#!/usr/bin/expect`, чтобы запускаться интерпретатором `expect`.

Автоматический ответ на простой запрос

#!/usr/bin/expect
set timeout 10
spawn sh -c "echo -n 'Proceed? (y/n) '
read response"
expect "Proceed? (y/n) "
send "y\r"
expect eof

Скрипт, который автоматически вводит 'y' в ответ на вопрос типа `Proceed? (y/n)`. (Используется `sh` для примера)

Автоматизация входа в SSH (предупреждение о безопасности)

#!/usr/bin/expect
set timeout 20
set username "your_user"
set hostname "your_host"
set password "your_password"

spawn ssh $username@$hostname
expect "password:"
send "$password\r"
expect "$"
send "ls -l\r"
expect "$"
send "exit\r"
expect eof

Пример автоматического входа на удаленный сервер по SSH и выполнения команды. **Включение пароля непосредственно в скрипт крайне опасно с точки зрения безопасности и не рекомендуется для реальных сред.**

Автоматизация команды passwd (предупреждение о безопасности)

#!/usr/bin/expect
set timeout 10
set old_pass "old_password"
set new_pass "new_password"

spawn passwd
expect "Current password:"
send "$old_pass\r"
expect "New password:"
send "$new_pass\r"
expect "Retype new password:"
send "$new_pass\r"
expect eof

Пример автоматического изменения пароля с помощью команды `passwd`. **Жесткое кодирование пароля в скрипте крайне опасно с точки зрения безопасности.**

Советы и предостережения

Скрипты `expect` мощны, но следует учитывать несколько моментов для обеспечения безопасности и стабильности.

Основные советы

  • **Безопасность паролей**: Прямое жесткое кодирование паролей в скриптах очень опасно. Рассмотрите использование переменных окружения, безопасных конфигурационных файлов или других механизмов безопасности, таких как `ssh-agent`.
  • **Настройка таймаута**: Используйте команду `set timeout`, чтобы установить максимальное время ожидания `expect` для определенного шаблона. Значение по умолчанию — 10 секунд, а `set timeout -1` установит бесконечное ожидание.
  • **Точное сопоставление шаблонов**: `expect` поддерживает регулярные выражения. Поскольку приглашения могут не совпадать точно, используйте гибкие шаблоны или подстановочный знак `*`.
  • **Отладка**: Запуск `expect -d your_script.exp` в режиме отладки позволяет подробно увидеть, какой шаблон ожидает `expect` и какую строку он отправляет.
  • **Использование `interact`**: Команда `interact` может использоваться для передачи управления пользователю в определенный момент выполнения скрипта.

Те же команды в категории