Ubuntu环境下Linux Shell脚本如何实现密码输入星号隐藏效果?
Linux Shell脚本实现密码输入隐藏/星号显示方案
完全可以实现该需求,以下是两种常用实现方案:
方案1:最简无回显模式(原生read支持)
直接使用read命令自带的-s(静默模式)参数即可关闭输入回显,搭配-p参数可以直接输出提示文本,无需单独编写echo语句。修改后的代码如下:
#!/bin/bash read -s -p "Enter Password:" p echo "" # 输入完成后换行,避免后续输出和提示行在同一行 if [ "$p" = "Passwords" ] then echo "Password Granted" else echo "Password Denied" fi
这个方案是Linux系统下密码输入的默认交互逻辑,比如sudo输密码时就是无回显效果,兼容性最好,几乎所有shell环境都支持。
方案2:输入字符显示为*(匹配网站登录交互效果)
如果需要输入时显示星号,需要手动编写逐字符读取的逻辑,核心是通过stty命令关闭终端回显,逐位读取输入字符,每读取一个有效字符就输出一个*,同时兼容退格删除操作。完整代码如下:
#!/bin/bash # 先保存终端原有设置,提前配置无论脚本是否退出都恢复终端回显,避免终端故障 old_stty=$(stty -g) trap 'stty "$old_stty"' EXIT echo -n "Enter Password:" p="" # 关闭回显,逐字符读取输入 stty -echo while IFS= read -r -n1 c; do # 检测到回车则结束输入 if [ "$c" = $'\n' ]; then break fi # 检测退格/删除按键 if [ "$c" = $'\177' ] || [ "$c" = $'\b' ]; then # 已有输入字符时才执行删除 if [ -n "$p" ]; then # 删除最后一个字符 p=${p%?} # 退格、擦除星号、再退格实现界面上的删除效果 echo -ne "\b \b" fi else # 普通字符追加到密码变量,输出一个星号 p+="$c" echo -n "*" fi done # 恢复终端回显(trap已经兜底,这里可以主动恢复) stty "$old_stty" echo "" if [ "$p" = "Passwords" ] then echo "Password Granted" else echo "Password Denied" fi
注意事项
- 所有操作终端回显的脚本,必须配置异常退出时的回显恢复逻辑,否则脚本意外中断后终端会出现输入无显示的问题,上述示例中用
trap捕获EXIT信号实现了兜底处理。 - 字符串比对时变量建议用双引号包裹,避免输入为空时触发语法报错。
内容的提问来源于stack exchange,提问作者Dreac Leoson
相关产品推荐
相关产品推荐

