Как я эхо-звезды (*) при чтении пароля с `read`?

Что мне нужно сделать для кода в Bash, если я хочу, чтобы echo * вместо символов пароля (или даже просто скрыть символы полностью), когда пользователь вводит что-то при использовании read?

Ответ 1

Как отметил Mark Rushakoff, read -s будет подавлять эхо символов, введенных в командной строке. Вы можете использовать эту функцию как часть этого script для эхо-звездочек для каждого введенного символа:

#!/bin/bash
unset password
prompt="Enter Password:"
while IFS= read -p "$prompt" -r -s -n 1 char
do
    if [[ $char == $'\0' ]]
    then
        break
    fi
    prompt='*'
    password+="$char"
done
echo
echo "Done. Password=$password"

Ответ 2

Мне очень понравился ответ, который дал Wirone, но мне не понравилось, что обратная ссылка продолжит удаление символов даже в подсказку "Введите пароль:".

У меня также были некоторые проблемы, при которых слишком быстрое нажатие клавиш приводило к тому, что некоторые персонажи на самом деле печатали на экране... никогда не очень полезно при запросе пароля. =)

Ниже приведена измененная версия ответа Wirone, в котором рассматриваются эти проблемы:

#!/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

Ответ 3

read -s должен поместить его в бесшумный режим:

-s     Silent mode.  If input is coming from a terminal, characters are not echoed.

Смотрите раздел read в man bash.

Ответ 4

Я не знаю о звездах, но stty -echo - ваш друг:

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

Источник: http://www.peterbe.com/plog/passwords-with-bash

Ответ 5

Я хотел бы добавить что-то к решению Dennis Williamson:

#!/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

В приведенном выше примере script правильно обрабатывает обратное пространство.

Источник

Ответ 6

stty -echo
read something
stty echo

останавливает ввод пользователем эхо на экран для этого чтения. В зависимости от того, что вы делаете с подсказками, вы можете добавить дополнительную команду echo для генерации новой строки после чтения.

Ответ 7

Если вы не заботитесь о том, чтобы быть интерактивным, вы можете просто сделать

read -s pass
echo "$pass" | sed 's/./*/g'

Это будет отображаться * для каждого символа введенного пароля после нажатия клавиши ввода.

Ответ 8

#!/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 "-------------------------------"