我正在编写一个 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
最佳答案
在脚本内的变量扩展周围使用双引号:
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
',两个' $
' 标志和换行符。您的脚本将逐字读取此内容;数据不会扩展。
关于从 STDIN 读取时,Bash 防止符号扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9527886/