从当前的Shell中扩展
假设这里的 sh
是一个快车道命令,它会调用一个带有给定参数的shell命令作为脚本文本:
sh './decrypt.sh "$ENCRYPTION_P12"'
请注意,如果这个被字面上作为命令行来调用的话,需要一个-c参数:
/bin/sh
。
sh -c './decrypt.sh "$ENCRYPTION_P12"'
请注意,这绝对取决于
ENCRYPTION_P12
是一个环境变量 - 也就是说,由设置它的系统通过
export
导出到环境中。
从调用脚本中展开
话虽如此,如果它是一个环境变量,您有更好的选择:直接使用它。
也就是说,在decrypt.sh
内部,您可以引用"$ENCRYPTION_P12"
而无需显式设置它,因为shell将所有环境变量隐式导入为shell变量 - 并且它们会传递给子进程而不需要任何显式操作。
应避免的事情:Shell注入攻击
最后,顺带提一下:危险的做法可能是:
sh "./decrypt.sh #{ENV['ENCRYPTION_P12']}"
或者
# STILL INSECURE
sh "./decrypt.sh \"#{ENV['ENCRYPTION_P12'}\""
或者
# STILL INSECURE
sh "./decrypt.sh '#{ENV['ENCRYPTION_P12'}'"
这将把值代替在Ruby级别生成的字符串中。然而,这是危险的,因为该字符串被解析为代码--这意味着ENCRYPTION_P12
的内容可能会被利用进行shell攻击。
例如,考虑以下bash语法的情况:
ENCRYPTION_P12=$'$(rm -rf ~)\'$(rm -rf ~)\''
如果直接将其替换到生成的 shell 脚本中(而不是在参数扩展期间展开 '${foo}'
,这在已经经过此危险阶段的扩展阶段之后发生),则两个 rm
都将被执行。