Interested Article - Expect

Expect — инструмент для автоматизации и тестирования в ОС Unix , написанный как расширение к скрипт-языку Tcl , для интерактивных приложений таких, как telnet , ftp , passwd , fsck , rlogin , , ssh , и других. С помощью Tk интерактивные приложения могут быть использованы с графическим интерфейсом (GUI) X11 .

Базовые понятия

Expect поддерживает механизм регулярных выражений и основные возможности программирования, позволяющие простым скриптам эффективно управлять такими программами как telnet , ftp , и ssh , не обладающими встроенным скрипт-языком, макросами, или другими механизмами программирования.

Эффективен при работе с сетевым оборудованием - массовое обновление конфигураций управляемого (активного) сетевого оборудования с дифференцированным выполнением команд (в зависимости от вендора, версии программного обеспечения либо типа (коммутатор, маршрутизатор и т. п.)).

Примеры

Простой пример скрипта, который автоматизирует сессию telnet:

   #!/usr/bin/expect
   ######################################################################################
   #$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 "%"
   # Посылаем команду, и ждем следующего приглашения ввода командного интерпретатора.
   send "$my_command\r"
   expect "%"
   # Запоминаем результат в переменной. Он может быть отображён, или записан на диск.
   set results $expect_out(buffer)
   # Завершаем сессию telnet, и ждем символа конца строки (eof).
   send "exit\r"
   expect eof

Ещё один скрипт, который в качестве примера автоматизирует ftp-сессию:

   #!/usr/bin/expect
   # Открыть 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
  • spawn - вызов программы
  • expect - ожидание вывода запущенной программой строки (дословно: ожидаем , что "скажет" выполняемая программа);
  • send - передача данных или команд в вызванную программу (выполняется так, как будто вы сами набираете команды в консоли)
  • close - завершение сценария

Использование

Expect выступает в качестве клея для склеивания существующих утилит. Главная идея состоит в том, чтобы использовать уже имеющиеся инструменты, а не решать проблему внутри Expect.

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

Скрипт Expect может запустить командный интерпретатор, прочитать переменные окружения, выполнить набор команд Unix для получения информации, и после этого ввести в интерфейс командной строки продукта полученную информацию для достижения цели, поставленной пользователем. После поиска информации в командной строке продукта, скрипт может принять интеллектуальное решение о том, какое действие предпринять, и т. п.

Каждый раз, когда Expect-операция выполнена, результаты помещаются в локальной переменной $expect_out. Это позволяет скрипту одновременно собирать информацию для передачи пользователю, и принимать логические решения о дальнейших действиях в зависимости от обстоятельств.

Expect широко используется как инструмент создания наборов для тестирования утилит, программ, встроенных систем. это комплект для тестирования написанный с применением Expect. Он использовался для тестирования компилятора gcc и хорошо подходит для тестирования на удалённых компьютерах (например для разработки встроенных систем).

Мнения

Сильные стороны

Expect может запускаться через равные промежутки времени с помощью cron для инкапсуляции задач системного администрирования. Цель такого режима использования в том, чтобы задействовать Expect для решения задач системного администрирования с помощью средств находящихся на этом же компьютере. Никаких дополнительных инструментов не нужно, для того, чтобы научиться. Если программист уже знает Tcl , то переход на Expect окажется лёгким и относительно простым. Поскольку программные структуры и синтаксис одинаковы, но добавятся дополнительные возможности.

На предприятиях имеется много вариантов использования Expect для решения внутренних задач. Он широко используется компаниями, такими как Silicon Graphics , IBM , Hewlett-Packard , Sun Microsystems , Xerox , , Tektronix , AT&T , и Всемирный банк для запуска внутренних задач автоматического тестирования в проектах разработки, передачи файлов, администрирования учётных записей и тестирования сети.

Expect портирован в языки Python и Perl в виде различных дополнительных модулей. Подмножество команд Expect-а портировано в java и доступно в (java-based Terminal Emulator). Реализация процедур в этих модулях это в основном интерпретация оригинальной версии с эквивалентной функциональностью. Однажды поняв концепцию, вы, при необходимости, можете перенести её на другие языки.

Слабые стороны

Expect унаследовал синтаксис Tcl , который не похож на другие скриптовые языки, такие как bash , csh , и Perl . Приходится постоянно помнить, когда перед переменной должен стоять знак «$», а когда нет. Есть версии Expect доступные для Perl и Python для тех, кто знаком с их синтаксисом.

Другое ограничение состоит в сложности портирования Expect-скриптов между платформами. Например, скрипт Expect, который написан для использования нескольких Unix утилит, может не работать, если будет запущен под Windows . По возможности, программист должен найти приложение, которое имеет интерфейс командной строки , который обеспечивает ту же самую информацию, а это вероятнее всего потребует изменения команды send/expect, которые могут быть главной частью скрипта. Эта проблема не возникает, если Вы используете tcl , perl или python с их posix интерфейсами для получения доступа к файлам (открытие/закрытие) и так далее, а также когда вы используете стандартные posix утилиты ( telnet , ftp и т. д.) для удалённого взаимодействия.

Итак, Expect автоматизирует инструменты, которые имеют интерфейс командной строки , но не утилиты, которые имеют графический интерфейс пользователя . В то время как Windows предоставляет множество различных утилит, многие из которых имеют только графический интерфейс и остаются вне зоны применения Expect-а. Графические приложения в Windows могут быть автоматизированы с помощью утилит подобных AutoIt .

Ссылки

  • Don Libes. . — O'Reilly & Associates, Inc, 1995. — ISBN 1-56592-090-2 .

Внешние ссылки

Источник —

Same as Expect