Автоматизация telnet, ssh и ftp сессий

В этой статье хочу рассказать о замечательной утилите, которая значительно облегчает админскую жизнь — 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&gt;"
   # Выключить приглашение ввода.
   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%.

Опубликовано в Linux

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Изображения должны быть включены!