需求:shell脚本中输入密码,要求不显示明文,需要将其转换为“*”星号,或者不显示
实现方案:有两种实现方案,一是通过stty命令来实现,二是直接使用read来实现
方案一:使用stty来实现
使用stty -echo可以实现不显示密码,就像登录Linux系统输入密码时一样,stty的代码如下:
#!/bin/bash
stty -echo # 不显示用户输入
read -p "请输入密码:" pwdstr
stty echo # 恢复显示用户输入
echo
echo "pwdstr:$pwdstr"
结果如下:
方案二:read实现方案
使用read -n 1 -s -p "" str可实现单字符输入,这样便于将输入字符转为“*”星号,代码如下
echo -e "请输入密码: \c"
pwdstr=''
while : ;
do
read -n 1 -s -p "" pw
if [ $pw ]; then
pwdstr=${pwdstr}$pw
echo -e "*\c" # 如果不需要显示,把这条命令删掉即可
else
echo
break
fi
done
echo "password is :$pwdstr"
结果如下:
总结:如果不显示密码,推荐使用方案一(stty),更方便,如果需要将密码转成“*”星号,则推荐使用方案二(read)
例子:下边是一个使用方案二(read)获取密码的完整例子,可参考
#!/bin/bash
# 输入的密码,每次用完该变量需要将其置为空
INPUTEDPWD=''
function getPwd() {
pwdPrompt="请输入${1}密码: "
confirmPwdPrompt="请再次输入${1}密码: "
# 输入密码的函数
function inputPwd() {
pwdstr=''
while : ;
do
read -n 1 -s -p "" pw
if [ $pw ]; then
pwdstr=${pwdstr}$pw
echo -e "*\c"
else
echo
break
fi
done
}
# 第一次输入密码
echo -e "${pwdPrompt}\c"
inputPwd
if [ ! $pwdstr ]; then
echo "密码不能为空"
return
fi
password1=$pwdstr
# 第二次输入密码
echo -e "${confirmPwdPrompt}\c"
inputPwd
password2=$pwdstr
# 两次密码进行比较
if [ "$password1" != "$password2" ]; then
echo "密码不一致"
return
fi
# 将正确的密码赋值给INPUTEDPWD
INPUTEDPWD=$password2
}
# 调用获取密码的函数
getPwd "管理员admin的"
# 从INPUTEDPWD中取密码
validpwd=$INPUTEDPWD
INPUTEDPWD=''
# 若密码不为空,说明密码获取成功,否则为失败
if [ $validpwd ]; then
echo "validpwd: $validpwd"
else
exit 1
fi