WebTech Varna 2007 Expect – the unexpected Marian Marinov – System Architect - Siteground.com
2 Agenda ➢ What is Expect and where it can help ➢ Implementations ➢ UNIX tool expect ➢ Python pexpect ➢ Perl Expect ➢ PHP expect Marian Marinov - Varna /30
3 What is Expect ➢ Automating Interactive Applications ➢ Unique System Administrators tool ➢ Just Another TCL extension ➢ Great automated application tester Where to use it: ➢ passwd automations ➢ automation of ncurses based application ➢ automated patch management Marian Marinov - Varna /30
4 UNIX Expect application Requirements:tcl & expect Don Libes - expect expect1.1> send "hello world" hello worldexpect1.2> exit expect expect1.1> send "hello world\n"; hello world expect1.2> exit Marian Marinov - Varna /30
5 UNIX Expect application cat speak.exp #!./expect -f send "hello world\n" hello world Marian Marinov - Varna /30
6 UNIX Expect application send – sending string to the command send_user – sending string to STDOUT send_log – sending string to text log file set timeout -1|0|60 – maximum wait for command input stty -echo – turn off KBD echo spawn – start a program interact – returns the control of the started command back to user Marian Marinov - Varna /30
7 UNIX Expect application match_max max buffer size log_user 0|1 – enable/disable logging to STDOUT log_file filename – file where to store the script output as addition to STDOUT expect -exact – match exact string expect -re – match regular expression expect eof – wait the command to finish Marian Marinov - Varna /30
8 UNIX Expect application expect { # nestead expectes -re "" { } -exact "" { } -re "" { } Marian Marinov - Varna /30
9 UNIX Expect application Get some user input: stty -echo expect_user -re "(.*)\n" set password $expect_out(1,string) send_user "\n" Marian Marinov - Varna /30
10 UNIX Expect application Show some examples :) Marian Marinov - Varna /30
11 UNIX Expect application I'm stupid and I didn't understood anything Can I still use Expect? YES autoexpect Marian Marinov - Varna /30
12 UNIX Expect application autoexpect ftp ftp.example.com autoexpect -f ftp.exp ftp ftp.example.com -c – conservative mode -p – prompt mode Marian Marinov - Varna /30
13 Python pexpect package URL: Requirements: python2.4 & pty package Installation: 1. download pexpect-2.1.tar.gz 2. tar zxf pexpect-2.1.tar.gz 3. cd pexpect python setup.py install Marian Marinov - Varna /30
14 Python pexpect package import pexpect child = pexpect.spawn ('ftp ftp.openbsd.org') child.expect ('Name.*: ') child.sendline ('anonymous') child.expect ('Password:') child.sendline child.expect ('ftp> ') child.sendline ('cd pub') child.expect('ftp> ') child.sendline ('get ls-lR.gz') child.expect('ftp> ') child.sendline ('bye') Marian Marinov - Varna /30
15 Python pexpect package Regular expression problems: matching the end of the line can be tricky :) The $ pattern for end of line match is useless. child.expect ('\w+\r\n') - matching word at the end of the line minimal match(instead of the standard greedy): child.expect ('.+') - match always one char child.expect ('.*') - match always zero or one char Marian Marinov - Varna /30
16 Expect for Perl Packages: Expect Expect::Simple Installation: perl -MCPAN -e 'install Expect' perl -MCPAN -e 'install Expect::Simple' Download and compile ( Marian Marinov - Varna /30
17 Expect for Perl Expect->new(); $object->debug($debug_level); $object->exp_internal(0 | 1); $object->raw_pty(0 | 1); Marian Marinov - Varna /30
18 Expect for Perl $object->match(); $object->matchlist(); $object->match_number(); $object->error(); $object->command(); $object->exitstatus(); $object->do_soft_close(); $object->restart_timeout_upon_receive(0 | 1); Marian Marinov - Varna /30
19 Expect for Perl $object->log_group(0 | 1 | undef); $object->log_user(0 | 1 | undef); $object->log_file("filename" | $filehandle | \&coderef | undef); $object->match_max($max_buffersize or undef); $object->pid(); $object->send_slow($string_to_send); Marian Marinov - Varna /30
20 Expect in PHP Requirements: libexpect >= PHP >= PECL Installation: pear install expect Marian Marinov - Varna /30
21 Expect in PHP ini_set ("expect.loguser", "Off"); $stream = fopen ("expect://ssh uptime", "r"); $cases = array ( array (0 => "password:", 1 => PASSWORD) ); Marian Marinov - Varna /30
22 Expect in PHP switch (expect_expectl ($stream, $cases)) { case PASSWORD: fwrite ($stream, "password\n"); break; default: die ("Error was occurred while connecting to the remote host!\n"); } while ($line = fgets ($stream)) { print $line; } fclose ($stream); Marian Marinov - Varna /30