expect the unexpected

Download Expect the unexpected

If you can't read please download the document

Upload: marian-marinov

Post on 16-Apr-2017

2.996 views

Category:

Technology


0 download

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