- Home »

Пример скрипта Expect для SSH — учебное пособие
В этой статье разберёмся, что такое скрипты Expect для SSH, зачем они нужны и как их использовать для автоматизации рутинных задач на серверах. Если ты когда-нибудь сталкивался с необходимостью автоматизировать ввод паролей, ответы на промпты или просто хочешь быстро и без лишних телодвижений управлять кучей серверов — Expect может стать твоим новым любимым инструментом. Здесь не будет занудных теорий — только практические советы, реальные примеры, грабли, на которые наступают новички, и лайфхаки, которые экономят часы жизни. Погнали!
Как это работает? Expect — магия автоматизации CLI
Expect — это утилита и язык сценариев, который позволяет автоматизировать взаимодействие с программами, работающими через командную строку. Особенно полезен, когда нужно “общаться” с программами, которые требуют интерактивного ввода (например, пароль при SSH-подключении, подтверждение каких-то действий и т.д.).
- Работает поверх Tcl (Tool Command Language), но не пугайся — синтаксис простой.
- Позволяет эмулировать действия пользователя: отправлять команды, ждать определённых сообщений, реагировать на них.
- Часто используется для автоматизации рутины: массовое обновление серверов, деплой, резервное копирование, тестирование CLI-приложений.
В отличие от bash-скриптов, которые “не умеют” работать с интерактивными программами (например, когда ssh просит ввести пароль), Expect может “читать” вывод и “отвечать” на него, как человек.
Как быстро и просто всё настроить?
Давай по шагам. Для начала — установка. Expect есть почти во всех репозиториях Linux-дистрибутивов, а для macOS — через brew. На Windows можно использовать Cygwin или WSL.
# Debian/Ubuntu
sudo apt update
sudo apt install expect
# CentOS/RHEL
sudo yum install expect
# macOS (через Homebrew)
brew install expect
Проверяем, что всё ок:
expect -v
Теперь — минимальный рабочий пример. Допустим, тебе нужно подключиться по SSH к серверу, который не поддерживает ключи (или ты не хочешь их настраивать), и автоматически ввести пароль.
#!/usr/bin/expect -f
set timeout 10
set host "example.com"
set user "myuser"
set password "mypassword"
spawn ssh $user@$host
expect "password:"
send "$password\r"
interact
Сохрани этот скрипт, например, как ssh_expect.exp, сделай исполняемым:
chmod +x ssh_expect.exp
И запускай:
./ssh_expect.exp
Всё! Скрипт сам введёт пароль и передаст тебе управление сессией.
Примеры, схемы, практические советы
Давай разберём несколько кейсов — от простых до чуть более продвинутых.
Кейс | Плюсы | Минусы | Рекомендации |
---|---|---|---|
Автоматизация ввода пароля при SSH | Быстро, просто, не требует настройки ключей | Пароль хранится в явном виде, не безопасно | Использовать только для тестов или на закрытых стендах |
Массовое выполнение команд на нескольких серверах | Экономия времени, можно делать деплой, обновления | Сложнее поддерживать, нужен список серверов | Хранить список серверов в отдельном файле, использовать циклы |
Автоматизация работы с программами, которые требуют интерактива (scp, sftp, passwd) | Можно автоматизировать даже “упрямые” утилиты | Иногда ломается при изменении вывода программы | Тестировать после обновлений, использовать “expect -re” для гибкости |
Пример: массовое обновление серверов через SSH
#!/usr/bin/expect -f
set timeout 20
set password "mypassword"
set servers [list "host1" "host2" "host3"]
foreach server $servers {
spawn ssh myuser@$server "sudo apt update && sudo apt upgrade -y"
expect {
"password:" { send "$password\r"; exp_continue }
"Do you want to continue?" { send "y\r"; exp_continue }
eof
}
}
Этот скрипт подключается к каждому серверу из списка, выполняет обновление, автоматически подтверждает ввод пароля и “yes” на промпт.
Пример: смена пароля пользователя
#!/usr/bin/expect -f
set timeout 10
set user "myuser"
set oldpass "oldpass"
set newpass "newpass"
spawn passwd $user
expect "Current password:"
send "$oldpass\r"
expect "New password:"
send "$newpass\r"
expect "Retype new password:"
send "$newpass\r"
expect eof
Положительные и отрицательные кейсы
- Плюсы:
- Мгновенная автоматизация там, где ключи не вариант или нужен интерактив.
- Можно быстро “записать” последовательность действий и повторять их сколько угодно раз.
- Подходит для тестирования CLI-приложений, которые требуют ручного ввода.
- Минусы:
- Безопасность: пароли в явном виде — зло. Лучше использовать только для временных задач или в изолированных средах.
- Хрупкость: если изменится вывод программы (например, ssh начнёт спрашивать что-то новое), скрипт может сломаться.
- Не всегда удобно для сложных сценариев — иногда проще написать на Python с pexpect или использовать Ansible.
Похожие решения, программы и утилиты
- pexpect — аналог для Python, более гибкий, поддерживает асинхронность и интеграцию с другими библиотеками. Документация
- Ansible — мощный инструмент для автоматизации управления конфигурациями, работает по SSH, но требует ключей. Официальный сайт
- Fabric — Python-библиотека для автоматизации SSH-задач, удобна для деплоя. Документация
- sshpass — простая утилита для передачи пароля в ssh, но менее гибкая, чем Expect. man-страница
Статистика и сравнение с другими решениями
Инструмент | Гибкость | Безопасность | Лёгкость освоения | Поддержка интерактива |
---|---|---|---|---|
Expect | Высокая | Средняя (пароли в скрипте) | Средняя | Да |
pexpect (Python) | Очень высокая | Средняя | Высокая (если знаешь Python) | Да |
Ansible | Высокая | Высокая (ключи, vault) | Средняя | Нет (только команды, не интерактив) |
sshpass | Низкая | Низкая | Очень простая | Нет |
Интересные факты и нестандартные способы использования
- Expect можно использовать для автоматизации telnet, ftp, scp и даже для тестирования собственных CLI-программ.
- Можно “записать” сценарий взаимодействия с любой программой, которая работает в терминале, и потом воспроизводить его на сотнях серверов.
- Некоторые используют Expect для автоматизации legacy-систем, где нет API, но есть терминал.
- Можно интегрировать Expect в CI/CD пайплайны для автоматизации тестирования CLI-интерфейсов.
- С помощью Expect можно даже “играть” в текстовые игры или автоматизировать ввод команд в консольных приложениях (например, Minecraft server CLI).
Какие новые возможности открываются и чем это поможет в автоматизации и скриптах?
- Автоматизация рутинных задач без необходимости ручного ввода паролей и подтверждений.
- Массовое управление серверами, особенно если ключи не настроены или невозможны.
- Тестирование CLI-программ, которые требуют интерактивного ввода.
- Интеграция в пайплайны DevOps для автоматизации деплоя, обновлений, резервного копирования.
- Быстрое прототипирование автоматизации для нестандартных задач, где другие инструменты не подходят.
Вывод — заключение и рекомендации
Expect — это отличный инструмент для тех, кто хочет быстро автоматизировать работу с интерактивными CLI-программами, особенно по SSH. Он прост в освоении, гибок и позволяет экономить кучу времени на рутине. Но помни о безопасности: не храни пароли в явном виде в продакшене, используй Expect для временных задач, тестов, автоматизации на стендах или в изолированных средах. Для более сложных сценариев — смотри в сторону pexpect, Ansible или Fabric.
Если ты ищешь, где развернуть свои эксперименты или автоматизировать управление сервером — посмотри VPS или выделенные серверы на этом блоге. А если остались вопросы по Expect или хочется поделиться своим кейсом — пиши в комментарии, разберём вместе!
Официальная документация Expect: https://core.tcl-lang.org/expect/index
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.