Mie Dic 20, 2006 7:12 pm
|
 |
creating021
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 |
|
|
| 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 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.
 |
|
|
|

Mie Dic 20, 2006 8:12 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4225
Ubicación: Valladolid, España
|
|
|
|
|
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
|
|
|
Jue Dic 21, 2006 2:25 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
|
|
|
|
|
| Pues, creo que es mejor usar Term::ReadPassword que Term::Screen, pero sin duda Term::ReadKey es una buena solución. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|