Interested Article - Expect
- 2021-05-14
- 1
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 .
Внешние ссылки
- 2021-05-14
- 1