从 Fastlane 将环境变量传递给 shell 脚本
Passing an environment variable to a shell script from Fastlane
我是 运行 Fastlane(iOS 的持续构建工具),以便执行用于解密文件的自定义 shell 脚本。
这是命令。
sh "./decrypt.sh ENV['ENCRYPTION_P12']"
我想不出将环境变量传递给该脚本的方法。显然,如果我将密码硬编码到脚本中,它就可以正常工作。
sh "./decrypt.sh mypwd"
有什么建议吗?
立即从内部扩展Shell
假设这里的 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 变量-- 并且它们被传递给子进程而无需任何明确的操作。
要避免的事情: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 脚本(与在参数扩展期间扩展相反 - '${foo}'
- 发生,rm
将执行在 造成这种危险的扩张阶段已经过去之后)。
快速通道的具体答案是https://docs.fastlane.tools/advanced/#shell-values
或者,从您的 Fastfile 中:
decrypted = sh("./decrypt" ENV[ENCRYPTION_P12])
我是 运行 Fastlane(iOS 的持续构建工具),以便执行用于解密文件的自定义 shell 脚本。
这是命令。
sh "./decrypt.sh ENV['ENCRYPTION_P12']"
我想不出将环境变量传递给该脚本的方法。显然,如果我将密码硬编码到脚本中,它就可以正常工作。
sh "./decrypt.sh mypwd"
有什么建议吗?
立即从内部扩展Shell
假设这里的 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 变量-- 并且它们被传递给子进程而无需任何明确的操作。
要避免的事情: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 脚本(与在参数扩展期间扩展相反 - '${foo}'
- 发生,rm
将执行在 造成这种危险的扩张阶段已经过去之后)。
快速通道的具体答案是https://docs.fastlane.tools/advanced/#shell-values
或者,从您的 Fastfile 中:
decrypted = sh("./decrypt" ENV[ENCRYPTION_P12])