Обзор
`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` может использоваться для передачи управления пользователю в определенный момент выполнения скрипта.