6

我正在运行Fastlane(iOS 的持续构建工具)以执行自定义 shell 脚本来解密文件。

这是命令。

sh "./decrypt.sh ENV['ENCRYPTION_P12']"

我想不出一种将环境变量传递给该脚本的方法。显然,如果我将 pwd 硬编码到脚本中,它就可以正常工作。

sh "./decrypt.sh mypwd"

有什么建议么?

4

2 回答 2

16

从即时外壳内扩展

假设sh这里是一个 fastlane 命令,它使用给定的参数作为脚本文本调用 shell 命令:

# as a fastlane directive
sh './decrypt.sh "$ENCRYPTION_P12"'

请注意,如果这是作为 命令行 的字面调用/bin/sh,则需要一个-c参数:

# in other contexts
sh -c './decrypt.sh "$ENCRYPTION_P12"'

请注意,这绝对取决于ENCRYPTION_P12是否是环境变量——也就是说,export由设置它的系统编辑到环境中。


从调用的脚本中扩展

也就是说,如果它一个环境变量,你有一个更好的选择:使用它。

也就是说,在内部,您无需显式设置decrypt.sh即可引用,因为 shell 隐式地将所有环境变量作为 shell 变量导入 - 并且无需任何显式操作即可将它们传递给子进程。"$ENCRYPTION_P12"


要避免的事情:Shell 注入攻击

最后,顺便说一句:这样做的危险方法是:

# INSECURE: DO NOT DO THIS
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 语法给出):

# this will make any of the above do Very Evil Things
ENCRYPTION_P12=$'$(rm -rf ~)\'$(rm -rf ~)\''

...rm如果直接替换到生成的 shell 脚本中,这两个 s 都将执行(而不是在参数扩展期间扩展 -- '${foo}'-- 这发生使这种危险的扩展阶段已经过去之后)。

于 2016-01-18T13:04:06.300 回答
4

fastlane 的具体答案是https://docs.fastlane.tools/advanced/#shell-values

或者,从您的 Fastfile 中: decrypted = sh("./decrypt" ENV[ENCRYPTION_P12])

于 2016-10-13T14:44:17.800 回答