需求: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