Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
45
Добавлен:
03.06.2014
Размер:
154.62 Кб
Скачать

Вытягивание Файлов: система expect

Существует несколько способов реализации системы вытягивания файлов. Один из них, оказывается, полезен и для решения других задач, заключается в том, чтобы сделать системные файлы доступными пo ftp с центрального сервера и осуществлять последующую их выборку и инсталляцию с помощью программ, использующих команды expect.

Система expect представляет собой набор расширений языка Tcl (Tool Command Language — инструментальный командный язык), который разработал Джон Остерхут (John Ousterhout). Эти расширения позволяют писать управляющие сценарии для интерактивных программ. Система expect отличается от обычного языка сценариев (такого, например, который принят в большинстве shell) тем, что обеспечивает пошаговое управление процессами. Можно проверять результат каждой операции и определять, какие входные данные необходимо посылать дальше. Кроме того, язык expect устойчив к недружелюбным действиям, которые может предпринять программа, считающая, что работает с реальным терминалом.

Тсl сам по себе — функционально полный язык сценариев. Формально сценарии expect — это просто сценарии Тсl, в которых используются дополнительные команды, определенные в расширениях expect. Вовсе, однако, не обязательно знать слишком много о Тсl, чтобы писать простые expect-сценарии.

Тсl синтаксически прост. Большинство команд задаются как команды shell: Вы просто разделяете команду и ее аргументы пробелами. Фигурные скобки объединяют групповые элементы в отдельные "слова" и позволяют продлевать операторы на несколько строк. В качестве разделителя команд используется точка с запятой; в конце строки и перед закрывающей фигурной скобкой разделитель не обязателен.

Вот основные команды expect:

spawn — запустить подпроцесс для управления;

send — послать в подпроцесс входную информацию;

expect — выполнить действие в зависимости от выходной информации подпроцесса.

Может оказаться полезной четвертая команда, interact, если Вы захотите, чтобы expect выполнила часть задачи, а затем передала управление Вам.

Перед тем как рассматривать команды по отдельности, разберем простой пример. Этот сценарий пересылает с машины netserver (посредством ftp) файл /etc/passwd:

Spawn /usr/ucb/ftp netserver

while 1 { expect {

"Name*: " {send "netclient\r"}

"Password:" {send "netclientpw\r"}

"ftp> " (break)

"failed" (send user "Can't log in.\r"; exit 1)

timeout (send user "Timeout problem, \r"; exit 2}

}}

send "led /etc\r"

expect "ftp> " (send "cd pub/sysfiles\r"}

expect "ftp> " (send "get passwd\r")

expect "ftp> " (send "quit\r"; send_user "\r")

exit 0

Логика выполнения операций здесь очевидна. Расссматриваемый сценарий сначала запускает команду ftp netserver, а затем ожидает приглашения ко вводу имени и пароля в цикле while (базовая конструкция языка Тсl). После получения основного приглашения ftp> программа выходит из цикла while, и в ftp подается простая серия команд. Перед посылкой каждой команды сценарий ожидает, пока завершится выполнение предыдущей команды; это не строго обязательно, но делает вывод информации очень удобным.

Начальный цикл регистрации предназначен для решения еще двух проблем. Во-первых, проверка условия "failed" "вылавливает" ситуацию, когда удаленная машина отклоняет указанное имя и пароль и ftp выводит сообщение Login failed.'*

Условие timeout позволяет обнаружить случаи, когда в течение десяти секунд ничего интересного не происходит, возможно, потому, что сетевой сервер отключен. Если возникает одна из описанных выше ситуаций, сценарий выводит сообщение об ошибке и завершает свое выполнение.

Этот сценарий предполагает, что после успешного входа в систему ошибок быть не может. В реальной ситуации Вам, вероятно, захочется усложнить его. В этом примере для нескольких пересылок файлов задается в цикле while одна процедура обработки ошибок. Система expect содержит несколько специальных версий команды expect, предназначенных для решения этой проблемы менее заковыристым способом.

Команда spawn команда выполняет команду команда, которая может включать свои собственные аргументы. "Волшебный ключик", обозначающий команду, помешается в переменную spawn_id. Команды expect и send работают с процессом, указанным в этой переменной, поэтому путем сохранения и восстановления значения spawn_id Вы можете переключаться с одного подпроцесса на другой.

Команда send посылает на стандартный ввод подпроцесса строку, указанную в ней в качестве аргумента. Если хотите, можете явно включить в эту строку символ возврата каретки (вводится как \г). Строку без пробелов и специальных символов нужно брать в кавычки. Команда send_user аналогична команде send, за исключением того, что строка посылается на стандартный вывод сценария.

В команде expect в качестве аргументов задаются группы пар шаблон/действие. Если аргументы занимают несколько строк, как в приведенном выше примере, их следует заключить в фигурные скобки. Каждый аргумент действие также необходимо брать в фигурные скобки.

Шаблон — это то, что нужно искать в выходной информации команды; как только появляется эта строка, инициируется соответствующее ей действие.

Поиск по шаблону осуществляется, как правило, в соответствии с синтаксисом shell, но можно использовать и регулярные выражения. Действия, указанные для условий timeout и eof, запускаются соответственно после некоторого (задаваемого) периода бездействия и в конце входного потока.

Система expect поставляется с множеством готовых сценариев, которые Вы можете адаптировать под свои собственные процессы.

Соседние файлы в папке lect_doc