我正在编写一个bash脚本,它将通过STDIN
接收密码并进行一些不同的检查。
当我使用包含符号的密码时,我遇到了问题。
普通密码grassy
没问题,但gra$$y
等复杂组合将扩展为gra3308y
。
这是我正在使用的脚本:
read INPUT
if [ $(echo -n $INPUT|wc -m) -ge 6 ]
then exit 0
else exit 1
fi
我尝试了所有不同类型的引用,但我无法阻止STDIN
密码扩展特殊字符。
这是一个例子,没有在原始值周围加上单引号可以解决这个问题吗?
david@hostname ~ $ echo gra$$| { read INPUT; echo ${INPUT}; }
gra2598
答案 0 :(得分:2)
在脚本中的变量扩展周围使用双引号:
read INPUT
echo "Password was: $INPUT"
if [ $(echo -n "$INPUT" | wc -m) -ge 6 ]
then echo "OK"; exit 0
else echo "Bogus"; exit 1
fi
在开发脚本时,使用echo
显示您正在使用的内容,但也使用双引号。
如果在此程序中键入一行,则不会对您键入的字符进行shell扩展。如果您模拟用echo
键入的用户,则需要阻止执行echo
的shell扩展任何元字符,因此:
echo 'gra$$' | bash yourscript
省略单引号意味着shell将使用PID替换$$
(可能是父shell的PID而不是管道中的shell,但是有一些PID)。这与您在运行后键入5个字符加上换行符不同:
bash yourscript
你也可以使用:
$ cat > password-file
gra$$
<control-D>
$ cat password-file
gra$$
$ bash yourscript < password-file
<control-D>
是EOF指示;它刷新自输入上一个换行符以来键入的所有零个字符,cat
将可用的零字节解释为EOF。因此,该文件包含6个字符:字母“g
”,“r
”,“a
”,两个“$
”符号和换行符。这将由您的脚本逐字阅读;数据不会扩展。