env USER=..some code... ./script.sh
考虑到脚本本身使用echo $USER
或,是否可以通过设置传递一些可执行的shell代码tmpdir=/var/tmp/log-$USER
答案1
您可以将环境变量中的 shell 代码传递给脚本,没有问题,但脚本需要预期变量中的 shell 代码并按如下方式对其进行评估:
参见例如之间的区别
$ env USER='$(echo hello)' bash -c 'echo "$USER"'
$(echo hello)
和
$ env USER='$(echo hello)' bash -c 'eval "echo \"$USER\""'
hello
在上述两个命令中,一段代码都被传递$USER
到脚本中bash -c
。该代码是一个简单的命令替换,如果计算的话将输出字符串hello
,并且调用 shell 将不是评估命令替换,因为它是单引号内的字符串。第一个bash -c
脚本不会计算字符串,因此它会打印 shell 代码。第二个bash -c
脚本将传递的字符串作为调用的一部分进行评估echo
,因此打印echo
(它基本上运行echo "$(echo hello)"
.
这种解决问题的方法既脆弱又危险,因为它允许用户将任意 shell 代码传递到您的脚本中(事实上,它依赖传递代码并无条件执行它)。这是一个典型的代码注入漏洞。
我认为你想做的是通过细绳,不是 shell 代码:
$ env USER="$(echo hello)" bash -c 'echo "$USER"'
hello
这里,变量在调用脚本之前USER
被设置为字符串(因为 shell 会在双引号内扩展命令替换)。然后脚本获取该字符串并回显它。在您的情况下,脚本将获取该字符串并将其用作路径名的一部分。hello
bash -c
要点是字符串是在脚本获取之前由用户计算的。