How do I echo stars (*) when reading password with `read`?

后端 未结 10 804
死守一世寂寞
死守一世寂寞 2020-11-29 02:13

What do I need to do for code in Bash, if I want to echo *s in place of password characters (or even just hide the characters completely) when the user types so

相关标签:
10条回答
  • 2020-11-29 02:33
    #!/bin/bash
    echo "------------------------------"
    
    n=7
    echo " Enter Password :"
    
    for (( i=1;i<n;i++ ))
    do
        stty -echo
        read -r -s -n 1 char
        stty echo
    
        echo -n "*"
        pass+="$char"
    
    done
    
    echo " "
    echo " Your password : $pass "
    
    echo ""
    echo "-------------------------------"
    
    0 讨论(0)
  • 2020-11-29 02:38

    I really liked the answer that Wirone gave, but I didn't like that the backspacing would continue removing characters even back into the "Enter password: " prompt.

    I also had some issues where pressing keys too rapidly would cause some of the characters to actually print on the screen... never a good thing when prompting for a password. =)

    The following is my modified version of Wirone's answer which addresses these issues:

    #!/bin/bash
    
    unset PASSWORD
    unset CHARCOUNT
    
    echo -n "Enter password: "
    
    stty -echo
    
    CHARCOUNT=0
    while IFS= read -p "$PROMPT" -r -s -n 1 CHAR
    do
        # Enter - accept password
        if [[ $CHAR == $'\0' ]] ; then
            break
        fi
        # Backspace
        if [[ $CHAR == $'\177' ]] ; then
            if [ $CHARCOUNT -gt 0 ] ; then
                CHARCOUNT=$((CHARCOUNT-1))
                PROMPT=$'\b \b'
                PASSWORD="${PASSWORD%?}"
            else
                PROMPT=''
            fi
        else
            CHARCOUNT=$((CHARCOUNT+1))
            PROMPT='*'
            PASSWORD+="$CHAR"
        fi
    done
    
    stty echo
    
    echo $PASSWORD
    
    0 讨论(0)
  • 2020-11-29 02:38

    I don't know about stars, but stty -echo is your friend:

     #!/bin/sh 
     read -p "Username: " uname 
     stty -echo 
     read -p "Password: " passw; echo 
     stty echo
    

    Source: http://www.peterbe.com/plog/passwords-with-bash

    0 讨论(0)
  • 2020-11-29 02:42

    I would like to add something to Dennis Williamson's solution:

    #!/bin/bash
    
    unset password
    echo -n "Enter password: "
    while IFS= read -p "$prompt" -r -s -n 1 char
    do
        # Enter - accept password
        if [[ $char == $'\0' ]] ; then
            break
        fi
        # Backspace
        if [[ $char == $'\177' ]] ; then
            prompt=$'\b \b'
            password="${password%?}"
        else
            prompt='*'
            password+="$char"
        fi
    done
    

    In above example script handles backspace correctly.

    Source

    0 讨论(0)
提交回复
热议问题