How can I enter a password using Perl and replace the characters with '*'?

后端 未结 7 992
长发绾君心
长发绾君心 2020-12-03 03:54

I have a Perl script that requires the user to enter a password. How can I echo only \'*\' in place of the character that the user types, as they type it?

I\'m using

相关标签:
7条回答
  • 2020-12-03 04:04

    If you don't want use any packages... Only for UNIX

    system('stty','-echo');
    chop($password=<STDIN>);
    system('stty','echo');
    
    0 讨论(0)
  • 2020-12-03 04:06

    Building on Pierr-Luc's program, just added some control on the backslashes. With this, you can't keep pressing backslash forever:

    sub passwordDisplay() {
        my $password = "";
        # Start reading the keys
        ReadMode(4); #Disable the control keys
        my $count = 0;
        while(ord($key = ReadKey(0)) != 10) {
                # This will continue until the Enter key is pressed (decimal value of 10)
                # For all value of ord($key) see http://www.asciitable.com/
                if(ord($key) == 127 || ord($key) == 8) {
                        # DEL/Backspace was pressed
                        if ($count > 0) {
                                $count--;
                                #1. Remove the last char from the password
                                chop($password);
                                #2 move the cursor back by one, print a blank character, move the cursor back by one
                                print "\b \b";
                        }
                }
                elsif(ord($key) >= 32) {
                        $count++;
                        $password = $password.$key;
                        print "*";
                }
        }
        ReadMode(0); #Reset the terminal once we are done
        return $password;
    }
    
    0 讨论(0)
  • 2020-12-03 04:08

    Have you tried storing the string (so that your program can still read it) and find out its length then create a string of the same length, but only use '*'?

    0 讨论(0)
  • 2020-12-03 04:10

    You can play with Term::ReadKey. Here is a very simple example, with some detection for backspace and delete key. I've tested it on Mac OS X 10.5 but according to the ReadKey manual it should work under Windows. The manual indicates that under Windows using non-blocking reads (ReadKey(-1)) will fail. That's why I'm using ReadKey(0) who's basically getc (more on getc in the libc manual).

    #!/usr/bin/perl                                                                                                                                                                                                
    
    use strict;                                                                                                                                                                                                    
    use warnings;                                                                                                                                                                                                  
    use Term::ReadKey;                                                                                                                                                                                             
    
    my $key = 0;                                                                                                                                                                                                   
    my $password = "";                                                                                                                                                                                             
    
    print "\nPlease input your password: ";                                                                                                                                                                        
    
    # Start reading the keys                                                                                                                                                                                       
    ReadMode(4); #Disable the control keys                                                                                                                                                                         
    while(ord($key = ReadKey(0)) != 10)                                                                                                                                                                            
    # This will continue until the Enter key is pressed (decimal value of 10)                                                                                                                                      
    {                                                                                                                                                                                                              
        # For all value of ord($key) see http://www.asciitable.com/                                                                                                                                                
        if(ord($key) == 127 || ord($key) == 8) {                                                                                                                                                                   
            # DEL/Backspace was pressed                                                                                                                                                                            
            #1. Remove the last char from the password                                                                                                                                                             
            chop($password);                                                                                                                                                                                       
            #2 move the cursor back by one, print a blank character, move the cursor back by one                                                                                                                   
            print "\b \b";                                                                                                                                                                                         
        } elsif(ord($key) < 32) {                                                                                                                                                                                  
            # Do nothing with these control characters                                                                                                                                                             
        } else {                                                                                                                                                                                                   
            $password = $password.$key;                                                                                                                                                                            
            print "*(".ord($key).")";                                                                                                                                                                              
        }                                                                                                                                                                                                          
    }                                                                                                                                                                                                              
    ReadMode(0); #Reset the terminal once we are done                                                                                                                                                              
    print "\n\nYour super secret password is: $password\n";   
    
    0 讨论(0)
  • 2020-12-03 04:10

    You should take a look at either Term::ReadKey or Win32::Console. You can use those modules to read the single key strokes and emit '*' or whathever.

    0 讨论(0)
  • 2020-12-03 04:12

    In the past I have used IO::Prompt for this.

    use IO::Prompt;
    my $password = prompt('Password:', -e => '*');
    print "$password\n";
    
    0 讨论(0)
提交回复
热议问题