Home » Пример скрипта Expect для SSH — учебное пособие
Пример скрипта Expect для SSH — учебное пособие

Пример скрипта 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


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked