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