shell实现输入密码显示星号
2016-05-14 08:07
876 查看
shell实现输入密码显示星号
2013-09-07
shell脚本可以使用read -s来默认禁止回显输入字符,这样做一定程度上可以保证安全性。但这并不是一个好的交互,因为对于输入密码并不能知道已经输入了多少个字符。而使用*(星号)来代替输入的字符是一个很不错的想法,即保证安全又有好的交互性。程序的实现
首先要实现不显示输入字符,这个可以使用命令stty来实现
stty cbreak -echo dd if=/dev/tty bs=1 count=1 2>/dev/null stty -cbreak echo
运行上面的命令(放在脚本中),可以发现输入一个字符并不会在屏幕上显示出来,这是因为
stty -echo会禁止回显,而
dd if=/dev/tty bs=1 count=1 2>/dev/null则是获取刚刚输入的字符,如果将上面的命令放在$()中运行,并将其赋值给变量,打印会发现就是刚刚输入的字符。
由于上面的命令只是接收一个字符,要多个字符的话需要使用while语句来实现,然后通过判断输入的字符是否为回车键来实现结束输入。
while : ;do
char=`
stty cbreak -echo dd if=/dev/tty bs=1 count=1 2>/dev/null stty -cbreak echo`
if [ "$char" = "" ];then
break
fi
password="$password$char"
done
然后我们来实现输出为星号。这个很简单,上面的程序在整个过程中不会输出任何字符,要实现输出只需要在每次while循环的结束输出一个*即可。
while : ;do
char=`
stty cbreak -echo dd if=/dev/tty bs=1 count=1 2>/dev/null stty -cbreak echo`
if [ "$char" = "" ];then
break
fi
password="$password$char"
echo -n "*"
done
OK,全部实现完毕,密码存在password变量中。
错误解决
但在运行中会发现,按删除(backspace)不会减少个数,反而增加了。直接运行read命令,然后按backspace键,会发现输出了“^H”,这是因为backspace并未绑定为删除功能,需要在脚本中添加
stty erase "^H"来解决这一问题。但此时问题还是存在,原因在于backspace也是一个按键,而while中的判断并未判断按键为backspace的情况,因而程序会运行到输出一行。解决的方法就是在while中判断backspace按键并进行相应的操作。
首先是判断backspace按键,获取backspace按键的方法有两种:第一种是使用子shell输出backspace的转义字符即
$(echo -ne "\b")、第二种是利用vim,先按ctrl+v然后再backspace,就会输出backspace的标志。
然后是删除之前的一个字符,这里使用shell的ANSI控制码,首先将光标前移一个字符
printf "33[1D",然后删除光标之后的字符
printf "33[K",当然,还要将最后一个字符从password变量中移除。
最后完整的程序应该是:
x=0
while : ;do
char=`
stty cbreak -echo dd if=/dev/tty bs=1 count=1 2>/dev/null stty -cbreak echo`
if [ "$char" = "" ];then
break
fi
if [[ "$ret" == $(echo -ne '\b') ]];then
if [ $x -eq 0 ];then
continue
fi
password="${password%?}"
printf "33[1D"
printf "33[K"
let x--
continue
fi
password="$password$char"
echo -n "*"
let x++
done
相关文章推荐
- shell script 交互式脚本,可以读取命令行参数、选项,用户输入数据
- 第二节windows系统下Xshell 5软件远程访问虚拟机 Linux系统
- shell原理和问答机制引入
- linux shell脚本监控端口
- clone repository in git shell under windows
- Shell脚本学习指南(二)——变量、条件、循环
- hbase基本概念和hbase shell常用命令用法
- linux shell 特殊变量
- shell脚本+x
- ~/.bashrc 和 ~/.bash_profile 和 /etc/bashrc 和 /etc/profile 脚本的区别和启动加载顺序
- Windows日志管理相关脚本
- Delete log files longer than 45 days
- shell-5.shell echo 命令
- Deploy NRPE config files
- Powershell check server patch status
- 在shell中如何把10进制字符转换成16进制形式输出?
- shell-4.shell双引号,单引号,反引号,反斜杠
- 用shell监控站点目录下的文件是否被修改
- shell-3.shell特殊变量
- shell脚本中修改文件的内容