Gary Yang wrote:
> Hi,
>  
> The script bellow prompt user to enter login password. But, when I enter 
> the passwd at prompt, it shows me the passwd I typed. How to make the 
> passwd invisible while I'm typing the passwd?
>  
>   print "\nPlease Enter login passwd: ";
>   chomp($passwd = <STDIN>);

Try something like this (on Windoze, it takes like 4 returns for ReadKey to get
the return, but should work fine on Linux) - this one allows editing of the 
passwd
during input (<BS>/^U) :

#!perl --

use strict;
use warnings;
use Term::ReadKey;      END { ReadMode ('restore'); }   # just in case

my $passwd = get_passwd ();
print "Normally you wouldn't print this: $passwd\n";
exit;

sub get_passwd {

# legal clear passwd chrs (26+26+10+24=86): "a-zA-Z0-9!#$%&()*+,-./:;<=>[EMAIL 
PROTECTED]";
my @legal_clear = ('a'..'z', 'A'..'Z', '0'..'9', split //,
   '!#$%&()*+,-./:;<=>[EMAIL PROTECTED]');
my %legal_clear; foreach (@legal_clear) { $legal_clear{$_} = 1; }

$| = 1; # unbuffer stdout to force unterminated line out

print "Password: ";

ReadMode ('cbreak');
my $ch = '';
while (defined ($ch = ReadKey ())) {

        last if $ch eq "\x0D" or $ch eq "\x0A";
        if ($ch eq "\x08") {    # backspace
                print "\b \b" if $passwd;       # back up 1
                chop $passwd;
                next;
        }
        if ($ch eq "\x15") {    # ^U
                print "\b \b" x length $passwd; # back 1 for each char
                $passwd = '';
                next;
        }
        if (not exists $legal_clear{$ch}) {
                print "\n'$ch' not a legal password character\n";
                print 'Password: ', "*" x length $passwd; # retype *'s
                next;
        }
        $passwd .= $ch;
        print '*';
}
print "\n";
ReadMode ('restore');
return $passwd;

}

__END__
_______________________________________________
Perl-Unix-Users mailing list
Perl-Unix-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to