expect the unexpected
TRANSCRIPT
WebTech Varna 2007
Expect the unexpected
Marian Marinov [email protected] Architect - Siteground.com
`Agenda
What is Expect and where it can help
Implementations
UNIX tool expect
Python pexpect
Perl Expect
PHP expect
Marian Marinov - [email protected]
WebTech Varna 2007
1/30
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 - [email protected]
WebTech Varna 2007
2/30
UNIX Expect application
Requirements:tcl & expect
Don Libes - http://expect.nist.gov/
hackman@gamelon:~$ expect
expect1.1> send "hello world"
hello worldexpect1.2> exit
hackman@gamelon:~$ expect
expect1.1> send "hello world\n";
hello world
expect1.2> exit
Marian Marinov - [email protected]
WebTech Varna 2007
3/30
UNIX Expect application
hackman@gamelon:~$ cat speak.exp
#!./expect -f
send "hello world\n"
hackman@gamelon:~$ ./speak.exp
hello world
Marian Marinov - [email protected]
WebTech Varna 2007
4/30
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 - [email protected]
WebTech Varna 2007
5/30
UNIX Expect application
match_max 100000 - 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 - [email protected]
WebTech Varna 2007
6/30
UNIX Expect application
expect {
# nestead expectes
-re "" {
}
-exact "" {
}
-re "" {
}
}
Marian Marinov - [email protected]
WebTech Varna 2007
7/30
UNIX Expect application
Get some user input:
stty -echo
expect_user -re "(.*)\n"
set password $expect_out(1,string)
send_user "\n"
Marian Marinov - [email protected]
WebTech Varna 2007
8/30
UNIX Expect application
Show some examples :)
Marian Marinov - [email protected]
WebTech Varna 2007
9/30
UNIX Expect application
I'm stupid and I didn't understood anything
Can I still use Expect?
YES
autoexpect
Marian Marinov - [email protected]
WebTech Varna 2007
10/30
UNIX Expect application
autoexpect ftp ftp.example.com
autoexpect -f ftp.exp ftp ftp.example.com
-c conservative mode-p prompt mode
Marian Marinov - [email protected]
WebTech Varna 2007
11/30
Python pexpect package
URL: http://pexpect.sourceforge.net/
Requirements: python2.4 & pty package
Installation:1. download pexpect-2.1.tar.gz2. tar zxf pexpect-2.1.tar.gz3. cd pexpect-2.14. python setup.py install
Marian Marinov - [email protected]
WebTech Varna 2007
12/30
Python pexpect package
import pexpectchild = pexpect.spawn ('ftp ftp.openbsd.org')child.expect ('Name .*: ')child.sendline ('anonymous')child.expect ('Password:')child.sendline ('[email protected]')child.expect ('ftp> ')child.sendline ('cd pub')child.expect('ftp> ')child.sendline ('get ls-lR.gz')child.expect('ftp> ')child.sendline ('bye')
Marian Marinov - [email protected]
WebTech Varna 2007
13/30
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 charchild.expect ('.*') - match always zero or one char
Marian Marinov - [email protected]
WebTech Varna 2007
14/30
Expect for Perl
Packages:ExpectExpect::Simple
Installation:perl -MCPAN -e 'install Expect'perl -MCPAN -e 'install Expect::Simple'Download and compile(http://search.cpan.org)
Marian Marinov - [email protected]
WebTech Varna 2007
15/30
Expect for Perl
Expect->new();$object->spawn(@command);$object->debug($debug_level);$object->exp_internal(0 | 1);$object->raw_pty(0 | 1);
Marian Marinov - [email protected]
WebTech Varna 2007
16/30
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 - [email protected]
WebTech Varna 2007
17/30
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);$object->send_slow($delay, @strings_to_send);
Marian Marinov - [email protected]
WebTech Varna 2007
18/30
Expect in PHP
Requirements:libexpect >= 5.43.0PHP >= 4.3.0 PECL
Installation:pear install expect
Marian Marinov - [email protected]
WebTech Varna 2007
19/30
Expect in PHP
ini_set ("expect.loguser", "Off"); $stream = fopen ("expect://ssh root@remotehost uptime", "r"); $cases = array ( array (0 => "password:", 1 => PASSWORD) );
Marian Marinov - [email protected]
WebTech Varna 2007
20/30
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 - [email protected]
WebTech Varna 2007
21/30