Controlando los Ecos

En el ejemplo anterior (sección 8.9.7) utilizamos el módulo Term::ReadKey para evitar el eco del password en pantalla. Es posible lograr el mismo efecto usando las funcionalidades proveídas por Expect. Sigue la porción de código que cambia:
lhp@nereida:~/Lperl/src/expect/tutorial$ cat -n etsii2
 1  #!/usr/bin/perl -w
 2  use strict;
 3  use Expect;
 4
 5  # $Expect::Debug=2;
 6   $Expect::Exp_Internal=1;
 7
 8  my $RSH='/usr/bin/ssh';
 9  my $host_to_login_to='username@remote_machine';
10  my $machine='tomillo';
11
12  # Get the password.
13  print "Enter password: ";
14  my $stdin=Expect->exp_init(\*STDIN);
15  $stdin->exp_stty('-echo'); # Now turn off echoing
16  my ($match_num,$error,$match,$before,$after)=$stdin->expect(undef,"\n");
17  my $password = $before;
18  $stdin->exp_stty('echo'); # Turn echo back on
19  print "\n"; # print that newline that wasn't echoed
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";
..  ..... ....  ............. # Same as in the former example
43  $rsh->interact();
La llamada de la línea 14 retorna una referencia al objeto Expect creado. El constructor tiene dos formas de llamada:
Expect->exp_init(\*FILEHANDLE) 
Expect->init(\*FILEHANDLE)
Una vez creado es posible llamar al método exp_stty el cuál tiene la sintáxis:
$object->stty(qw(mode1 mode2...))
que establece los modos de la terminal virtual creada. En este caso desactivamos el eco a pantalla de los caracteres de entrada. A continuación llamamos a expect en un contexto de lista.
my ($match_num,$error,$match,$before,$after)=$stdin->expect(undef,"\n");

El significado de los elementos retornados es como sigue:

  1. La variable $match_num contiene el mismo valor que se retorna en un contexto escalar: la posición del patrón que ha casado dentro de la lista de patrones que se hayan pasado o bien undef si no hubo matching. En todos los ejemplos que hemos puesto sólo se ha escrito un patrón, pero expect admite que se le pasen varios.
  2. La variable $error contiene un número seguido de una cadena que nos comunica la naturaleza del error. Por ejemplo: 1:TIMEOUT.
  3. Las variables $match, $before y $after contienen las cadenas que han casado, la cadena que precede a esta y la que va después de aquella.
Al hacer que el primer argumento de la llamada a expect en la línea 16 sea undef estamos haciendo que espere tiempo ilimitado8.1 hasta que se encuentre el patrón \n.

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