Что мне нужно сделать для кода в Bash, если я хочу, чтобы echo *
вместо символов пароля (или даже просто скрыть символы полностью), когда пользователь вводит что-то при использовании read
?
Как я эхо-звезды (*) при чтении пароля с `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
Ответ 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 "-------------------------------"