在YAML Cloudformation上转义括号,反斜杠和双引号的问题

问题描述

我正在努力将sed命令放入YAML AWS CloudFormation模板中,该模板是从serverless模板处理的。

因此,我需要在AWS::CloudFormation::Init块中执行的命令是:

sed -i.bak '/PRE_CLAsspATH=/c\PRE_CLAsspATH="${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLAsspATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLAsspATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLAsspATHSEP}${PRE_CLAsspATH}"' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh

首先,我遇到${Variables}的问题,因为Serverless认为它们是它应该关注的变量。我使用!Join函数以这种方式解决了该问题(this approach在无服务器上不起作用):

cmd03_01:
  command: !Join 
    - ''
    - - sed -i.bak '/PRE_CLAsspATH=
      - '/c\PRE_CLAsspATH="'
      - '$'
      - '{MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar'
      - '$'
      - '{CLAsspATHSEP}'
      - '$'
      - '{WL_HOME}/modules/net.shibboleth.utilities.java-support.jar'
      - '$'
      - '{CLAsspATHSEP}'
      - '$'
      - '{WL_HOME}/modules/org.slf4j.slf4j-api.jar'
      - '$'
      - '{CLAsspATHSEP}'
      - '$'
      - '{PRE_CLAsspATH}"'
      - ' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh'

由于某人(无服务器,CloudFormation或YAML解释器)对反斜杠和双引号进行了转义,因此这不会产生所需的输出

我的结果是这样的:

sed -i.bak '/PRE_CLAsspATH=/c\\PRE_CLAsspATH=\"${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLAsspATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLAsspATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLAsspATHSEP}${PRE_CLAsspATH}\" /opt/oracle/config/domains/bi/bin/setDomainEnv.sh

如您所见,在当前的”字符和双引号上添加一个额外的”。

我试图在YAML上转义该字符串以避免这种行为,但这是最糟糕的。

在YAML模板上使用文字命令有任何想法或建议吗?

谢谢

解决方法

好吧,我觉得看到这么多特殊字符让我有些头晕,我迷路了。

/var/lib/cfn-init/data/metadata.json,我看到的是这样的东西:

"cmd03_01":{
  "command":"sed -i.bak '/PRE_CLASSPATH=/c\\PRE_CLASSPATH=\"${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLASSPATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLASSPATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLASSPATHSEP}${PRE_CLASSPATH}\"' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh"
},

所以,我认为这是错误的,因为我看到了 \ 字符换行了。这是我的困惑。这可以,因为该JSON文件中的键是一个字符串,因此必须正确地转义字符串的内容。

这里,我在无服务器模板中留下了两种声明sed命令的方法,例如我的示例:

#1

cmd01:
  command: sed -i.bak '/PRE_CLASSPATH=/c\PRE_CLASSPATH="${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLASSPATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLASSPATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLASSPATHSEP}${PRE_CLASSPATH}"' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh

#2

cmd03_02:
  command: !Join 
    - ""
    - - sed -i.bak '/PRE_CLASSPATH=/c
      - "\\"
      - PRE_CLASSPATH=
      - "\""
      - $
      - "{MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar"
      - $
      - "{CLASSPATHSEP}"
      - $
      - "{WL_HOME}/modules/net.shibboleth.utilities.java-support.jar"
      - $
      - "{CLASSPATHSEP}"
      - $
      - "{WL_HOME}/modules/org.slf4j.slf4j-api.jar"
      - $
      - "{CLASSPATHSEP}"
      - $
      - "{PRE_CLASSPATH}"
      - "\"'"
      - ' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh'

我希望这可以节省一些人的时间。