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:
$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.
$error contiene un número seguido
de una cadena que nos comunica la naturaleza del error.
Por ejemplo: 1:TIMEOUT.
$match, $before y $after
contienen las cadenas que han casado, la cadena que precede
a esta y la que va después de aquella.
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
