从 STDIN 读取时,Bash 防止符号扩展

标签 bash quotes

我正在编写一个 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/

相关文章:

arrays - bash 将数组拆分为具有动态名称的单独文件

mysql - Bash:如何轻松编辑 5.4G SQL 转储中的一行

bash - bash 中\$$ 有什么用?

.net - RegEx忽略.net中带引号的字符串中的文本

c - 如何使用正确的参数在 C 中调用 execl()?

mysql - MySQL 中何时使用单引号、双引号和反引号

batch-file - 带引号的批量 findstr

linux - 在命令 "*/"中使用 "ls -d */"列出目录的任何原因?

linux - 创建永久别名 bash 命令

javascript - 如何使用 jQuery 将双引号内的破折号 html 元素作为目标?