Как было упомянуто ранее, функциональность Expect реинкарнировалась в других полезных инструментах. В качестве примера рассмотрим работу с perl-модулем Expect.pm, который можно найти на CPAN.
Задача: автоматизировать смену пароля у пользователя в Unix-подобной OS (для примера - в RHEL)
Решение: скрипт pexp.pl запускает passwd и дважды вводит пароль пользователя.
#!/usr/bin/perl -w use Expect; if ($#ARGV != 1) { die "A user name and a password required!\n" } my $timeout = 3; my $exp = new Expect; $exp->spawn("passwd", $ARGV[0]) or die "Cannot spawn passwd: $!\n"; $exp->expect($timeout, [ "UNIX password:" => sub { $exp->send("$ARGV[1]\n"); exp_continue; } ], ); $exp->soft_close();
Запуск:
[root@rhtest tmp]# useradd testuser [root@rhtest tmp]# ./pexp.pl testuser Hrw256asarR9 Changing password for user testuser. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully.
Не остались в стороне и почитатели Python. Вот пример работы с модулем Pexpect, который доступен на SourceForge.
Задача: есть скрипт reverse.py, который ожидает от пользователя ввод строки и выводит эту строку “справа налево”. Нужно написать Python-скрипт, который вызывает исходный скрипт и эмулирует ввод строки пользователем.
Решение:
Скрипт reverse.py:
#!/usr/bin/python phrase = list(raw_input('Enter a phrase: ')) phrase.reverse( ) print 'Vice versa:', ''.join(phrase)
Cкрипт pex.py:
#!/usr/bin/python import pexpect import sys if len(sys.argv) == 1: sys.exit ("Hmm. A program name required.") foo = pexpect.spawn('python %s' % sys.argv[1]) foo.logfile_read = sys.stdout foo.expect('.*a phrase:') foo.send('llaf sevael retfa sevael llaf\n') foo.expect (pexpect.EOF)
Запуск:
[ca@rhel752 tmp]# ./pex.py reverse.py Enter a phrase: llaf sevael retfa sevael llaf Vice versa: fall leaves after leaves fall
Хочется также упомянуть утилиту empty, написанную Михаилом Захаровым. Ее отличительными особенностями является простота использования и самодостаточность (не требует TCL, Perl, Python). Вот пример с сайта продукта:
#!/bin/sh empty -f -i in -o out telnet foo.bar.com empty -w -i out -o in "ogin:" "lusern" empty -w -i out -o in "assword:" "TopSecretn" empty -s -o in "who am in" empty -s -o in "exitn"
Скрипты, написанные на базе Expect/Expect.pm/Pexpect/empty, удобно применять для автоматизации разработки, установки и тестирования приложений, которые предполагают взаимодействие “человек-компьютер”. Хороший пример: скрипты для конфигурации VMware Server на Linux-системах, которые предполагают ответы пользователя на различные вопросы.
Следует отметить, что для реализации взаимодействия “компьютер-компьютер” зачастую бывают более удобны другие инструменты. Скажем, ftp-сессию можно реализовать на базе Expect-функциональности, но будет гораздо удобнее воспользоваться perl-модулем Net::FTP. Выбор инструмента определяется той задачей, которая стоит перед автоматизатором.
Что такое качество программного обеспечения и как его улучшить: теория и практика, задачи и решения, подводные камни и обходные пути.
Автор комментария : Alexey Smirnov | August 11, 2008
Интересная статья, хотя, имхо, тикль лаконичнее.
[Ответить]
Автор комментария : Капитан Аляска | August 12, 2008
Алексей, спасибо за комментарий. Да, старый конь борозды не испортит - на TCL можно ого-го какой код писать. Но молодежь в лице Python и Ruby напирает… :)
[Ответить]