Expect — Википедия

Expect
Тип инструмент для автоматизации и тестирования интерактивных приложений
Разработчик Don Libes
Написана на C
Операционная система Кроссплатформенное программное обеспечение
Последняя версия 5.45 (2013-05-02)
Лицензия общественное достояние
Сайт core.tcl.tk/expect

Expect — инструмент для автоматизации и тестирования в ОС Unix, написанный Don Libes как расширение к скрипт-языку Tcl, для интерактивных приложений таких, как telnet, ftp, passwd, fsck, rlogin, tip, 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 широко используется как инструмент создания наборов для тестирования утилит, программ, встроенных систем. DejaGnu это комплект для тестирования написанный с применением Expect. Он использовался для тестирования компилятора gcc и хорошо подходит для тестирования на удалённых компьютерах (например для разработки встроенных систем).

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

[править | править код]

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

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

Expect портирован в языки Python и Perl в виде различных дополнительных модулей. Подмножество команд Expect-а портировано в java и доступно в SwitchTermJ (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. Exploring Expect: A Tcl-Based Tool for Automating Interactive Programs. — O'Reilly & Associates, Inc, 1995. — ISBN 1-56592-090-2.

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

[править | править код]