#!/bin/bash
prompt="Enter password: "
password=""
# Turn off echo
stty -echo
# Print prompt
printf "$prompt"
while IFS= read -r -s -n1 char; do
if [[ $char == $'\0' ]]; then
break
elif [[ $char == $'\177' ]]; then
if [ ${#password} -gt 0 ]; then
password="${password%?}"
printf "\b \b"
fi
else
password+="$char"
printf "*"
fi
done
# Turn echo back on
stty echo
printf "\n"
# The password is now stored in the $password variable
echo "Password entered: $password"
get_password() {
# Get locale information https://unix.stackexchange.com/a/757655/70524
eval "$(locale)"
# Use `$TTY` if available (zsh), `$(tty)` otherwise (bash)
TTY=${TTY:-"$(tty)"}
{
echo SETPROMPT "Password:" # Set the prompt
# Add more such customization commands here
echo SETDESC "Enter password for $USER" # Set the description
# Then finally ask for the password itself.
echo GETPIN
} |
# pinentry assumes the frontend will be invoked in the background,
# and needs to be explicitly told what environment it should use
pinentry-curses --ttytype "$TERM" --ttyname "$TTY" --lc-ctype "$LC_CTYPE" --lc-messages "$LC_MESSAGES" |
while IFS= read -r line; do
case $line in
OK*) continue;;
D*) pass=${line#D }; printf "%s\n" "$pass";; # `D`ata line will have the password
*) printf "%s\n" "$line" >&2;; # Dump everything else as possible errors
esac;
done
}
像这样使用它:
password=$(get_password)
这将在终端中打开一个全屏对话框:
┌────────────────────────────────────────────────────┐
│ Enter password for muru │
│ │
│ Password: ________________________________________ │
│ │
│ <OK> <Cancel> │
└────────────────────────────────────────────────────┘
嗯,这是在 bash 中:
此代码将提示用户输入密码,输入的每个字符均显示 *,并正确处理退格键。输入的密码存储在密码变量中。
一些编程语言已经内置了该功能。
如果您正在使用
bash
,则只需使用 抑制输入-s
的选项即可:read
您仍然需要对显示星号进行破解,但您可以使用 Dennis Williamson 在此 SO 答案中描述的方法来执行此操作:
但是,这不支持删除 ay 个字符,因为退格键也只是回显为一个字符,
*
而不是删除。因此,Max Haase 的答案确实可以解决这个问题,它更好。这可能有点过头了,但如果您
pinentry
安装了 GPG 程序,您可以使用它们为用户呈现一个漂亮的密码提示界面,包括用于屏蔽字符的星号(默认启用)、密码强度计、密码确认等。但是,它使用命令响应系统通过管道进行通信,而不是直接使用选项进行调用。因此,您可以通过 的pinentry
输入发送命令来自定义提示,实际提示输入密码等,然后解析输出(将包括状态消息等)以获取密码。就像是:
像这样使用它:
这将在终端中打开一个全屏对话框:
(在我的终端上它是一个完美的盒子,但在网页上可能不会这样显示。)
如果有适当的环境,您还可以使用
pinentry-gnome
、、pinentry-qt
等来制作 GUI 提示。pinentry-mac