OpenQuality.ru

Качество программного обеспечения

Качество программного обеспечения: в главных ролях

Лента  Радар  Блог  Опыт  
Разум  Видео  Заметки  Эпизоды


Expect.pm, Pexpect, empty

Как было упомянуто ранее, функциональность 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. Выбор инструмента определяется той задачей, которая стоит перед автоматизатором.

Отправить в Twitter, Facebook, FriendFeed, ВКонтакте | Опубликовано 11.08.2008 в рубрике "Автоматизация"

Комментарии (2)

  1. Автор комментария : Alexey Smirnov | August 11, 2008

    Интересная статья, хотя, имхо, тикль лаконичнее.

    [Ответить]


  2. Автор комментария : Капитан Аляска | August 12, 2008

    Алексей, спасибо за комментарий. Да, старый конь борозды не испортит - на TCL можно ого-го какой код писать. Но молодежь в лице Python и Ruby напирает… :)

    [Ответить]



Добавить комментарий

Пожалуйста, исправьте результат: дважды два равно



КРАТКОЕ СОДЕРЖАНИЕ

Что такое качество программного обеспечения и как его улучшить: теория и практика, задачи и решения, подводные камни и обходные пути.


ПУТЕВОДИТЕЛЬ

Список всех статей с краткой аннотацией и разбивкой по рубрикам. Открыть карту.

ПОДПИСКА

Доступ к самым интересным материалам по электропочте и RSS. Подробности.

ИЩЕЙКА