Es habitual que cuando se quiera acceder a las máquinas de una organización se utilice una máquina bastion frente a la cual los usuarios deben identificarse. En el ejemplo que consideramos el usuario después de identificarse debe elegir la máquina a la que conectarse e identificarse de nuevo. El siguiente programa muestra como podemos reducir las tres cuestiones iniciales (password - máquina - password) a una sóla automatizando el proceso inicial para posteriormente darle el control al usuario.
lhp@nereida:~/Lperl/src/expect/tutorial$ cat -n etsii
1 #!/usr/bin/perl -w
2 use strict;
3 use Expect;
4 use Term::ReadKey;
5
6 # $Expect::Debug=2; # 2 is verbose debugging
7 $Expect::Exp_Internal=1; # Valuable when debugging expect() sequences
8 # $Expect::Log_Stdout = 1;
9 my $RSH='/usr/bin/ssh'; # Where is my ssh
10 my $host_to_login_to='username@remote_machine';
11 my $machine='tomillo';
12
13 # Get the password.
14 ReadMode('noecho');
15 print "Enter password: ";
16 my $password=ReadLine(0); ReadMode(0);
17 chomp $password;
18
19 print "$password\n";
20
21 my $rsh=Expect->spawn($RSH,$host_to_login_to);
22
23 # Look for a password prompt in the bastion
24 $rsh->expect(30,'-re','word:\s$')||(die"Never got password prompt\n");
25 print $rsh "$password\r";
26
27 # Look for machine prompt. Change 'salir\)(\s)+$' to whatever is appropriate
28 $rsh->expect(30,'-re','salir\)(\s)+$')||(die"Never got machine prompt\n");
29
30 print $rsh "$machine\r";
31
32 # Look for a password prompt in the new machine.
33 $rsh->expect(30,'-re','word:\s$')||(die"Never got password prompt\n");
34 #print $rsh "After password\n";
35
36 # Look for a prompt. Prompt can be # $ > or ] followed by a whitespace.
37 my $prompt = '[\]\$\>\#]\s$';
38
39 # Note the use of -re
40 $rsh->expect(30,'-re',$prompt)||(die "Never got prompt on host\n");
41
42 # OK, now return control to user.
43 $rsh->interact();
El ejemplo es similar al de la sección anterior. La clave para devolver el control al usuario está en la llamada al método interact en la línea 43. La sintáxis es:
$object->interact(\*FILEHANDLE, $escape_sequence)Por defecto
\*FILEHANDLE es \*STDIN y $escape_sequence
es undef. En general, no tiene por que ser una interacción con
el usuario: puede ser una interacción con otro proceso.
La interacción termina cuando se lee
la secuencia de escape $escape_sequence del
flujo de entrada FILEHANDLE.
Casiano Rodríguez León
