打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
shell实现输入密码显示星号

2013-09-07

shell脚本可以使用read -s来默认禁止回显输入字符,这样做一定程度上可以保证安全性。但这并不是一个好的交互,因为对于输入密码并不能知道已经输入了多少个字符。而使用*(星号)来代替输入的字符是一个很不错的想法,即保证安全又有好的交互性。

程序的实现

首先要实现不显示输入字符,这个可以使用命令stty来实现

stty cbreak -echodd if=/dev/tty bs=1 count=1 2>/dev/nullstty -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=0while : ;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



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
echo问题
Shell脚本 实现vi/cp/mv前自动备份源文件-Linux频道-中国IT实验室
TTY的那些事儿
遇到的小问题
Linux stty命令
Linux下没有conio.h已解决
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服