Ожидать - Expect

Ожидать
Оригинальный автор (ы)Дон Либес
Разработчики)Нильс Карлсон
Стабильный выпуск
5.45.4 / 4 февраля 2018; 2 года назад (2018-02-04)
Написано вC
Операционная системаPOSIX, Windows
ЛицензияВсеобщее достояние[1]
Интернет сайтосновной.tcl-lang.org/ожидать/

Ожидать является расширением Tcl язык сценариев, написанный Дон Либес. Программа автоматизирует взаимодействие с программами, которые текстовый терминал интерфейс. Expect, первоначально написанная в 1990 году для Unix платформа, с тех пор стала доступна для Майкрософт Виндоус и другие системы.

Основы

Expect используется для автоматизации управления интерактивными Приложения Такие как Telnet, FTP, пароль, fsck, rlogin, кончик, SSH, и другие. Ожидайте использования псевдотерминалы (Unix) или эмулирует консоль (Windows), запускает целевую программу, а затем взаимодействует с ней, как человек, через терминал или интерфейс консоли. Тк, другое расширение Tcl, может использоваться для предоставления GUI.

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

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

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

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

Обычно Expect используется для настройки пакета тестирования, будь то для программ, утилит или встроенных систем. DejaGnu - это набор тестов, написанный с использованием Expect для использования в тестировании. Он широко использовался для тестирования GCC и очень[нужна цитата ] хорошо подходит для тестирования удаленных целей, таких как встроенная разработка.

Можно автоматизировать создание сценария Expect с помощью инструмента под названием «autoexpect». Этот инструмент наблюдает за вашими действиями и генерирует сценарий ожидания с использованием эвристики. Хотя сгенерированный код может быть большим и несколько загадочным, всегда можно настроить сгенерированный сценарий, чтобы получить точный код.

# Предположим, что $ remote_server, $ my_user_id, $ my_password и # $ my_command были прочитаны ранее в скрипте.# Откройте сеанс Telnet с удаленным сервером и подождите # для приглашения имени пользователя.порождать телнет $ remote_serverожидать "имя пользователя:"# Отправьте имя пользователя и дождитесь запроса пароля.Отправить "$ my_user_id  r"ожидать "пароль:"# Отправьте пароль и дождитесь приглашения оболочки.Отправить "$ my_password  r"ожидать "%"# Отправьте предварительно созданную команду, а затем подождите # для другого приглашения оболочки.Отправить "$ my_command  r"ожидать "%"# Захватить результаты команды в переменную. Этот # можно отобразить или записать на диск.набор полученные результаты $ expect_out(буфер)# Выйдите из сеанса Telnet и дождитесь специального # символ конца файла.Отправить "выход  г"ожидать eof

Другой пример - сценарий, автоматизирующий FTP:

# Установите для параметра тайм-аута правильное значение.# Например, размер файла действительно большой и сеть # скорость - действительно одна проблема, вам лучше установить это # параметр значение.набор тайм-аут -1# Откройте FTP-сеанс на удаленном сервере и # ждем запроса имени пользователя.порождать ftp $ remote_serverожидать "имя пользователя:"# Отправьте имя пользователя и дождитесь запроса пароля.Отправить "$ my_user_id  r"ожидать "пароль:"# Отправьте пароль и дождитесь приглашения «ftp».Отправить "$ my_password  r"ожидать "ftp>"# Переключитесь в бинарный режим и дождитесь приглашения ftp.Отправить "корзина  г"ожидать "ftp>"# Отключить подсказку.Отправить "подсказка  г"ожидать "ftp>"# Получить все файлыОтправить "mget *  r"ожидать "ftp>"# Выйдите из FTP-сеанса и дождитесь специального # символ конца файла.Отправить "пока  г"ожидать eof

Ниже приведен пример автоматизации SFTP (с паролем):

#! / usr / bin / env expect -f# Процедура попытки подключения; результат 0, если ОК, 1 в противном случаеproc соединять {пароль} {  ожидать {    "Пароль:" {      Отправить "$ passw  r"        ожидать {          "sftp *" {            возвращаться 0          }        }    }  }  # Время вышло  возвращаться 1}# Прочитать входные параметрынабор Пользователь [Lindex $ argv 0]набор пароль [Lindex $ argv 1]набор хозяин [Lindex $ argv 2]набор место расположения [Lindex $ argv 3]набор file1 [Lindex $ argv 4]набор файл2 [Lindex $ argv 5]#puts "Данные аргумента:  n";# выводит "user: $ user";# вводит "пароль: $ пароль";# выводит "host: $ host";#puts "location: $ location";# выводит "файл1: $ файл1";# выводит "файл2: $ файл2";# Проверить, все ли были предоставленыесли { $ пользователь == "" || $ passw == "" || $ host == "" || $ location == "" || $ file1 == "" || $ file2 == "" }  {  ставит "Использование: <пользователь> <пароль> <хост> <расположение> <файл1 для отправки> <файл2 для отправки>  n"  выход 1}# Sftp на указанный хост и отправка файловпорождать sftp $ пользователь@$ hostнабор рез [соединять $ passw]если { $ rez == 0 } {  Отправить "cd $ location  r"  набор тайм-аут -1  Отправить "положить $ file2  r"  Отправить "положить $ file1  r"  Отправить "ls -l  r"  Отправить "выйти  г"  ожидать eof выход 0}ставит " nОшибка при подключении к серверу: $ host, user: $ user и пароль: $ passw!  n"выход 1

Использование паролей в качестве аргументов командной строки, как в этом примере, является огромной дырой в безопасности, поскольку любой другой пользователь на машине может прочитать этот пароль, запустив "пс ". Однако вы можете добавить код, который будет запрашивать пароль вместо того, чтобы указывать пароль в качестве аргумента. Это должно быть более безопасно. См. Пример ниже.

stty -эхоsend_user -- "Введите пароль: "expect_user -повторно "(. *)  n"send_user " п"stty эхонабор ПРОХОДИТЬ $ expect_out(1,нить)

Другой пример автоматического входа по SSH на пользовательский компьютер:

# Тайм-аут - это предопределенная переменная в Expect, которая # по умолчанию установлено на 10 секунд.# spawn_id - еще одна предопределенная переменная в Expect.# Рекомендуется закрыть дескриптор spawn_id # создается командой spawn.набор тайм-аут 60порождать ssh $ пользователь@машинапока {1} {  ожидать {    eof                          {перемена}    «Подлинность хозяина»   {Отправить "да  г"}    "пароль:"                  {Отправить "$ пароль  r"}    "*\]"                        {Отправить "выход  г"}  }}ждатьЗакрыть $ spawn_id

Альтернативы

Различные проекты реализуют функциональность, подобную Expect, на других языках, например C #, Ява, Scala, Groovy, Perl, Python, Рубин, Ракушка и Идти. Как правило, это не точные клоны оригинального Expect, но концепции, как правило, очень похожи.

C #

  • Ожидайте .NET - Ожидайте функциональность для C # (.NET)
  • DotNetExpect - Библиотека автоматизации консоли в стиле Expect для .NET.

Ява

  • ExpectIt - чистая реализация инструмента Expect на Java 1.6+. Он разработан, чтобы быть простым, легким в использовании и расширяемым.
  • ожидать4j - попытка Java-клона оригинального Expect
  • ExpectJ - Java-реализация утилит Unix expect
  • Ожидайте-для-Java - чистая реализация Java инструмента Expect.
  • expect4java - Java-реализация инструмента Expect, но поддерживает вложенные замыкания. Также существует оболочка для Groovy language DSL.

Scala

  • scala-expect - Scala-реализация очень небольшого подмножества инструмента Expect.

Groovy

  • expect4groovy - Groovy DSL-реализация инструмента Expect.

Perl

Python

  • Pexpect  — Python модуль управления интерактивными программами в псевдотерминале
  • winpexpect - перенос pexpect на платформу Windows
  • парамико-ожидание - Ожидаемое расширение Python для Paramiko SSH библиотека, которая также поддерживает журналы учета.

Рубин

  • RExpect - отказ от замены модуля expect.rb в стандартной библиотеке.
  • Expect4r - Взаимодействие с Cisco IOS, IOS-XR и Juniper JUNOS CLI

Ракушка

  • Пустой - похожая на ожидание утилита для запуска интерактивных команд в сценариях оболочки Unix
  • sexpect - Ожидайте снарядов. Он реализован в модели клиент / сервер, которая также поддерживает присоединение / отсоединение (например, Экран GNU ).

Идти

  • GoExpect - Пакет Expect-like для языка Go
  • ожидать - языковая библиотека Expect-like Go для автоматизации управления терминальными или консольными программами.

Ржавчина

Erlang

  • люкс - фреймворк автоматизации тестирования с командами исполнения в стиле Expect.

Рекомендации

  1. ^ «Часто задаваемые вопросы по Expect: политика нашей компании требует наличия лицензии для использования Expect. Где мы можем получить лицензию?». 2006-10-11.

дальнейшее чтение

внешняя ссылка