Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

POSIX::Termios: Ocultando input en 25 líneas

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mie Dic 20, 2006 7:12 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
POSIX::Termios: Ocultando input en 25 líneas Responder citando

Very Happy
Perl:
1: #!/usr/bin/env perl
 2: use strict;
 3: use POSIX qw(:termios_h);
 4: my $termios = new POSIX::Termios;
 5: my $fh_stdin = fileno(STDIN);
 6: $termios->getattr($fh_stdin);
 7: my $flags = $termios->getlflag();
 8: sub noecho {
 9:   $termios->setlflag($flags & ~&POSIX::ECHO);
10:   $termios->setattr($fh_stdin, TCSANOW); #modificamos STDOUT
11: }
13:
14: sub echo {
15:   $termios->setlflag(&POSIX::ECHO);
16:   $termios->setattr($fh_stdin, TCSANOW);
17: }
18:
19: print "Ahora no podemos ver lo que entramos\n";
20: print "Escribe algo: ";
21: noecho();
22: my $entrada = <STDIN>;
23: chomp $entrada;
24: echo();
25: print "\nEscribiste $entrada\n";


1: env encuentra el path de perl, lo ejecuta por nosotros.
2: Este es un pragma que limita las posibles inseguridades.
3: Incluimos una librería que nos brinda un estándar POSIX (Portable Operating
System Interface for uniX: estandar IEEE-IX de Open Group pero nombrado por
Richard Stallman) que da interfaces a APIs del kernel como threads, comunicación
Process-to-Process y otras cosas) que actualmente es soportado por todo UNIX®
y Unix-Like (BSD, GNU/Linux... ) tanto como Windows tipo NT (Windows NT, 2000,
2003, XP y Vista)
4: Creamos un nuevo objeto a Termios.
Termios es parte del estándar de las librerías POSIX de C, también de Perl Wink y
es una interface general de terminal, el equivalente en C sería termios.h y
unistd.h
5: Ahora guardamos en $fh_stdin el descriptor de STDIN; fileno se usa para crear
bitmask para trabajar con operaciones para tty (Teletypewriter).
6: Tomamos los atributos de STDIN.
7: Guardamos los parámetros de la terminal (ECHO, ECHOE, ECHOL et cetera).
8: Creamos la sub función.
9: Modificamos los parámetros de ECHO en la terminal.
10: Modificamos STDOUT.
14: Creamos la sub función echo.
15: Modificamos los parámetros a los anteriores.
16: Modificamos STDOUT.
19: Imprimimos un par de cosas.
20: Hacemos el noecho.
22: Guardamos la entrada del "standar input" (STDIN).
23: Cortamos el retorno de carro.
24: Nuevamente permitimos que se vea la entrada en la terminal haciendo echo.
25: Imprimimos la entrada.

También hay otros módulos como IO::Stty:
Perl:
#!/usr/bin/env perl
use strict;
use IO::Stty;
IO::Stty::stty(\*STDIN,'-echo');
print "Password: ";
chomp($pass_in = <STDIN>);
print "\n";
IO::Stty::stty(\*STDIN,$old_mode);

O se puede usar el comando stty (en Unix) pero con POSIX::Termios podemos hacer algo que correrá en cualquier máquina que soporte POSIX sin tener que instalar nada.
Smile
Mensaje Mie Dic 20, 2006 8:12 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4225
Ubicación: Valladolid, España
Responder citando

Está muy bien.

Recordar que Term::Screen y Term::ReadKey también permiten leer de la entrada, sin el echo:
Perl:
#!/usr/bin/perl
use Term::ReadKey;
ReadMode 'noecho'; # Activación no echo
print "Login:";
$pass = <>;
print "Pass: $pass";
ReadMode 0; # Reset tty antes de salir
Mensaje Jue Dic 21, 2006 2:25 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

Pues, creo que es mejor usar Term::ReadPassword que Term::Screen, pero sin duda Term::ReadKey es una buena solución.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group