Cambiando de Automático a Interactivo

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
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19