首页 > Shell > shell输入密码之具体代码实现

shell输入密码之具体代码实现

Shell 2013-03-06

shell输入密码之具体代码实现
在做shell脚本开发时会涉及到密码输入,就像系统密码输入一下,在终端不能将密码显示出来,直接不显示或者显示为*号.
一,不显示密码
1.直接通过read -s不回显密码.

oen@oen ~/code/shell/passwd $ bash read-s.sh
Username: oenhan.com
Password:
-------------------

Username is:oenhan.com
PassWord is:oenhan.com

#具体代码示例如下:
oen@oen ~/code/shell/passwd $ cat read-s.sh
#!/bin/bash

echo -n "Username: "
read username

echo -n "Password: "
read -s password

echo -e "n-------------------n"

echo "Username is:$username"
echo "PassWord is:$password"

2.通过stty -echo不回显密码
stty可以更改终端的一些特性,-echo选项可以使终端不回显输入的字符,echo选项重新回显字符

oen@oen ~/code/shell/passwd $ cat read-s.sh
#!/bin/bash

echo -n "Username: "
read username

echo -n "Password: "
stty -echo
read password
stty echo

echo -e "n-------------------n"

echo "Username is:$username"
echo "PassWord is:$password"

二,回显*号
1.使用read接受单字符,返回*

oen@oen ~/code/shell/passwd $ cat read_s.sh
#!/bin/bash
star=""
passwd=""
while read -p "${star}" -r -s -n 1 passwdchar
do
 case "${passwdchar}" in
 $(echo -e "n")) break;;
 #$(echo -e "b")) #在台式机的时候使用b识别的,但是用thinkpad就是识别不了backspace,发现用177编码
 $(echo $'177'))
 if [ -n "${passwd}" ];then
 passwd="$(echo "${passwd}" | sed 's/.$//g')"
 echo -n -e "b b"
 fi;;
 *) printf "*"
 passwd+="${passwdchar}";;
 esac
done
echo -e "n${passwd}"

主要使用了read的一些参数设置:-a, -d, -e, -n, -p, -r, -t, 和 -s八个选项。
-a :将内容读入到数值中

 echo -n "Input muliple values into an array:"
 read -a array
 echo "get ${#array[@]} values in array"

-d :定义一直读到出现执行的字符位置。例如read –d madfds value,读到有m的字符的时候就不在继续向后读,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除。这种方式可以输入多个字符串,例如定义“.”作为结符号等等。
-e :只用于互相交互的脚本,它将readline用于收集输入行。读到这几句话不太明白什么意思,先跳过。
-n :用于限定最多可以有多少字符可以作为有效读入。例如echo –n 4 value1 value2,如果我们试图输入12 34,则只有前面有效的12 3,作为输入,实际上在你输入第4个字符‘3’后,就自动结束输入。这里结果是value为12,value2为3。
-p :用于给出提示符,在前面的例子中我们使用了echo –n “…“来给出提示符,可以使用read –p ‘… my promt?’value的方式只需一个语句来表示。
-r :在参数输入中,我们可以使用’/’表示没有输入完,换行继续输入,如果我们需要行最后的’/’作为有效的字符,可以通过-r来进行。此外在输入字符中,我们希望/n这类特殊字符生效,也应采用-r选项。
-s :对于一些特殊的符号,例如箭头号,不将他们在terminal上打印,例如read –s key,我们按光标,在回车之后,如果我们要求显示,即echo,光标向上,如果不使用-s,在输入的时候,输入处显示^[[A,即在terminal上打印,之后如果要求echo,光标会上移。
-t :用于表示等待输入的时间,单位为秒,等待时间超过,将继续执行后面的脚本,注意不作为null输入,参数将保留原有的值。

这个代码有一个缺点:如果快速按键盘,会导致有些明文字符显示出来,建议用第二种方法
2.使用/dev/tty接受字符输入

#!/bin/bash
STTY_RESTORE=$(stty -g)
echo -n "Username: "
read username

echo -n "Password: "
stty -echo cbreak
while true
do
 character=$(dd if=/dev/tty bs=1 count=1 2> /dev/null)
 case $character in
 $(echo -e "n"))
 break
 ;;
 $(echo -e "b"))#此处可能不同的键盘设置匹配不同
 if [ -n "$password" ]; then
 echo -n -e "b b"
 password=$(echo "$password" | sed 's/.$//g')
 fi
 ;;
 *)
 password=$password$character
 echo -n '*'
 ;;
 esac
done
stty $STTY_RESTORE

echo -e "nnUsername is $username"
echo "Password is $password"

shell输入密码之具体代码实现来自于OenHan,链接为:http://oenhan.com/shell-read-password
更多阅读