我正在运行Fastlane(iOS的连续构建工具),以便执行自定义shell脚本来解密文件。
这是命令。
sh "./decrypt.sh ENV['ENCRYPTION_P12']"
我无法找到将环境变量传递给该脚本的方法。显然,如果我将pwd硬编码到脚本中,它就能正常工作。
sh "./decrypt.sh mypwd"
有什么建议吗?
答案 0 :(得分:10)
假设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
内,你可以引用"$ENCRYPTION_P12"
而不需要明确地设置它,因为shell隐式地将所有环境变量作为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 ~)\''
...如果直接替换为生成的shell脚本(而不是在参数扩展期间展开 - rm
- 将在{/ 1}}之后执行<{1}}将执行> em>使这种危险的扩张阶段已经过去了。)
答案 1 :(得分:2)
fastlane特定答案为https://docs.fastlane.tools/advanced/#shell-values
或者,从你的Fastfile中:
decrypted = sh("./decrypt" ENV[ENCRYPTION_P12])