将环境变量传递给Fastlane的shell脚本

Lor*_*o B 5 ruby bash shell fastlane

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

这是命令.

sh "./decrypt.sh ENV['ENCRYPTION_P12']"
Run Code Online (Sandbox Code Playgroud)

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

sh "./decrypt.sh mypwd"
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Cha*_*ffy 13

从即时壳牌中扩展

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

# as a fastlane directive
sh './decrypt.sh "$ENCRYPTION_P12"'
Run Code Online (Sandbox Code Playgroud)

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

# in other contexts
sh -c './decrypt.sh "$ENCRYPTION_P12"'
Run Code Online (Sandbox Code Playgroud)

请注意,这绝对取决于ENCRYPTION_P12是一个环境变量 - 即,export由设置它的系统编辑到环境.


从Invoked Script中扩展

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

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


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

最后,抛开:执行此操作的危险方法可能是:

# INSECURE: DO NOT DO THIS
sh "./decrypt.sh #{ENV['ENCRYPTION_P12']}"
Run Code Online (Sandbox Code Playgroud)

要么

# STILL INSECURE
sh "./decrypt.sh \"#{ENV['ENCRYPTION_P12'}\""
Run Code Online (Sandbox Code Playgroud)

要么

# STILL INSECURE
sh "./decrypt.sh '#{ENV['ENCRYPTION_P12'}'"
Run Code Online (Sandbox Code Playgroud)

...从而将值替换为Ruby级别的生成字符串.然而,这很危险,因为该字符串被解析为代码 - 这意味着ENCRYPTION_P12可以在shell攻击中利用内容.

例如,考虑这种情况(在下面以bash语法给出):

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

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

  • @LorenzoB.,一个巨大的区别:`#{foo}`在shell解析开始之前由Ruby评估,在大多数语法解析阶段已经完成之后,shell会评估`$ {foo}`.这就是为什么`#{foo}`引入了安全风险:以这种方式替换的内容可以被shell解析,就好像它是代码一样. (2认同)