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