Expect - инструмент для автоматизации интерактивных приложений таких, как telnet, ftp, passwd, fsck, rlogin, tip, Использование ssh, ssh-keygen, sshpass с примерами и других. Expect поддерживает механизм регулярных выражений и основные возможности программирования, позволяющие простым скриптам эффективно управлять такими программами, не обладающими встроенным скрипт-языком, макросами, или другими механизмами программирования. Эффективен при работе с сетевым оборудованием - массовое обновление конфигураций управляемого (активного) сетевого оборудования с дифференцированным выполнением команд.
Одним из главных применений Expect являются коммерческие приложения. Многие из этих приложений предоставляют интерфейс командной строки, но, как правило, его недостаточно для написания скриптов. Они созданы для обеспечения пользователя средствами администрирования, но производители зачастую не тратят денег на создание полноценного скриптового языка.
Expect унаследовал синтаксис Tcl, который не похож на другие скриптовые языки, такие как Основы BASH скрипты, циклы, горячие клавиши, C shell (csh), и perl.
Expect портирован в языки Синтаксис Python и Perl в виде различных дополнительных модулей. Подмножество команд Expect-а портировано в Как установить Java на Ubuntu и доступно в SwitchTermJ (java-based Terminal Emulator). Реализация процедур в этих модулях это в основном интерпретация оригинальной версии с эквивалентной функциональностью.
apt install expect-dev expect
Скрипт expect_autoexpect позволяет создать скрипт с командами из текущей сессии. Например, создадим скрипт, который применяет изменения настройки для Softswitch VoIP платформа MVTS (Мера) Pro.
# expect_autoexpect autoexpect started, file is script.exp # telnet 127.0.0.1 7000 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. ****************************************************************************** * Multiprotocol VoIP Transit Softswitch * * * ****************************************************************************** mvts3g|> config /etc/mvts3g/system-1.conf Step 1: Parsing a configuration file... Step 2: Configuring the system... Step 3: Done. mvts3g|> exit Connection closed by foreign host.
Жмем Ctrl-D для завершения работы скрипта expect_autoexpect
# exit autoexpect done, file is script.exp
Теперь у нас получился запускаемый скрипт script.exp, который позволяет вместо набора трех команд просто запустить его:
# ./script.exp
#!/usr/bin/expect -f ###################################################################################### #$remote_server - сервер, к которому осуществляется доступ # #$my_user_id - имя пользователя на сервере # #$my_password - пароль пользователя на сервере # #$my_command - команда, которая будет запущена на сервере set remote_server xxx.xxx.xxx.225 set my_user_id testuser set my_password testpass # Открыть ftp-сессию на удалённом сервере, и ждать запроса имени пользователя. spawn ftp $remote_server expect "username:" # Послать имя пользователя, и ждать приглашения ввода пароля. send "$my_user_id\r" expect "password:" # Послать пароль, и ждать приглашения ввода ftp. send "$my_password\r" expect "ftp>" # Переключиться в бинарный режим, и снова ждать приглашения ввода ftp. send "bin\r" expect "ftp>" # Выключить приглашение ввода. send "prompt\r" expect "ftp>" # Получить все файлы send "mget *\r" expect "ftp>" # Закончить ftp-сессию и ждать спецсимвол конца файла (eof). send "bye\r" expect eof
#!/usr/bin/expect -f #set timeout 100 set PASS "testpass" set USER "testuser" spawn ssh -T $USER@[lrange $argv 0 0]; expect "password:" send "$PASS\r" expect "$" send "ls\r" expect "$" send "exit\r" expect eof