Den*_*man 37 passwords bash shell
如果我想在用户输入内容时用回声*代替密码字符(甚至只是隐藏字符),我需要对Bash中的代码做什么read?
Pau*_*ce. 58
正如Mark Rushakoff指出的那样,read -s将抑制在提示符下键入的字符的回显.您可以将此功能用作此脚本的一部分,以便为每个键入的字符回显星号:
#!/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"
Run Code Online (Sandbox Code Playgroud)
小智 19
我真的很喜欢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
Run Code Online (Sandbox Code Playgroud)
Mar*_*off 12
read -s 应该把它放在静音模式:
-s Silent mode. If input is coming from a terminal, characters are not echoed.
Run Code Online (Sandbox Code Playgroud)
请参阅中的read部分man bash.
我想补充丹尼斯威廉姆森的解决方案:
#!/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
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,脚本正确处理退格.
我不知道星星,但stty -echo是你的朋友:
#!/bin/sh
read -p "Username: " uname
stty -echo
read -p "Password: " passw; echo
stty echo
Run Code Online (Sandbox Code Playgroud)
资料来源:http://www.peterbe.com/plog/passwords-with-bash