使用 USER 环境变量传递可执行命令

使用 USER 环境变量传递可执行命令

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 会在双引号内扩展命令替换)。然后脚本获取该字符串并回显它。在您的情况下,脚本将获取该字符串并将其用作路径名的一部分。hellobash -c

要点是字符串是在脚本获取之前由用户计算的。

相关内容