В этой статье хочу рассказать о замечательной утилите, которая значительно облегчает админскую жизнь — expect.
Дело в том, что очень часто приходится пользоваться одними и теми же командами по протоколам telnet, ssh и ftp.
Дело за малым — автоматизировать процесс.
В этом поможет expect.
По материалам Википедии : Expect — инструмент для автоматизации и тестирования в ОС Unix, написанный Don Libes как расширение к скрипт-языку Tcl, для интерактивных приложений таких, как telnet, ftp, passwd, fsck, rlogin, tip, ssh, и других. С помощью Tk интерактивные приложения могут быть использованы с графическим интерфейсом (GUI) X11.
Там же можно посмотреть и примеры скриптов :
Простой пример скрипта, который автоматизирует сессию telnet:
###################################################################################### #$remote_server - сервер, к которому осуществляется доступ # #$my_user_id - имя пользователя на сервере # #$my_password - пароль пользователя на сервере # #$my_command - команда, которая будет запущена на сервере # # # # Предполагается, что $remote_server, $my_user_id, $my_password, и $my_command # # были инициализированы в скрипте ранее. # ###################################################################################### # Открываем telnet сессию на удалённом сервере, и ждем запроса имени пользователя. spawn telnet $remote_server expect "username:" # Посылаем имя пользователя и ждем запроса пароля. send "$my_user_id\r" expect "password:" # Посылаем пароль и ждем приглашения ввода командного интерпретатора. send "$my_password\r" expect "%"<br /> # Посылаем команду, и ждем следующего приглашения ввода командного интерпретатора. send "$my_command\r" expect "%" # Запоминаем результат в переменной. Он может быть отображён, или записан на диск. set results $expect_out(buffer) # Завершаем сессию telnet, и ждем символа конца строки (eof). send "exit\r" expect eof |
Ещё один скрипт, который в качестве примера автоматизирует ftp-сессию:
# Открыть 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 |
Если честно — у меня толком это так и не заработало.
Может дело в разных версиях expect.
А может в синтаксисе.
Давайте рассмотрим основные принципы работы утилиты.
Насколько я понял — все достаточно просто:
- spawn — выполняет любую внешнюю команду.
- expect — пишем ожидаемый от внешней команды вопрос.
- send — а тут указываем на него ответ.
Ниже предлагаю свой скрипт автоматической заливки на ftp архива сделанного из статьи раньше про автоматическое резервирование.
#!/usr/bin/expect -f set timeout 3600 log_user 1 # Отключаем вывод, чтобы не мешался # Открываем ftp сессию на удаленном сервере spawn ftp 192.168.5.8 # Дожидаемся запроса имени пользователя expect "Name (192.168.5.8:root):" #посылаем имя пользователя send "user\r" #Ждем ввода пароля expect "Password:" # посылаем пароль send "password\r" #ждем приглашения от фтп сервера expect "ftp>" # Посылаем файл на фтп send "put /media/disk-1/backup/*\r" # Завершаем сессию ftp expect "ftp>" send "bye\r" expect eof |
set timeout 3600 — так как стандартный таймаут 10 секунд скрипт не дожидался загрузки довольно большого архива на фтп и принудительно завершал сессию. Увеличение таймаута приведет к более долгому ожиданию и позволит загрузить файл на фтп. Величину таймаута определяйте опытным путем, например, попробуйте залить такой файл вручную и накиньте 10%.
1 thoughts on “Автоматизация telnet, ssh и ftp сессий”