【问题标题】:Bash prevent symbol expansion when reading from STDINBash 在从 STDIN 读取时防止符号扩展
【发布时间】:2012-03-02 04:16:15
【问题描述】:

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

【问题讨论】:

  • 扩展它的不是标准输入,而是调用 'echo' 时的 shell ...一种可能的方法是将其存储到一个临时文件和 shred -u 该文件中。另一种方法是以偷偷摸摸的方式申请evalsed ...
  • 实际上,当您在 STDIN 上输入 gra$$ 时,您从 STDIN 读取的原始脚本工作正常,但您的测试命令当然会在 $$ 甚至在 INPUT 变量中读取之前扩展。
  • 还要注意read 在输入中吃反斜杠,除非你使用-r

标签: bash quotes


【解决方案1】:

在脚本内的变量扩展周围使用双引号:

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

&lt;control-D&gt; 是 EOF 指示;它刷新自最后一个换行符输入以来键入的所有零字符,cat 将可用的零字节解释为 EOF。因此,该文件包含 6 个字符:字母“g”、“r”、“a”、两个“$”符号和一个换行符。这将由您的脚本逐字阅读;不会对数据进行扩展。

【讨论】:

  • 谢谢乔纳森,不知道我在想什么。 +1
  • 试了一下,它正在工作。我明白你对回声扩展的意思,这让我很困惑。非常感谢您花时间解释它!
  • 您也可以使用set -f 完全禁用某些命令的通配,然后重新启用它...
猜你喜欢
  • 1970-01-01
  • 2020-06-24
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多