带有嵌入式 BASH/SED 命令的 CHEF 脚本:意外的“}”

CHEF Scipt with embedded BASH/SED command: unexpected `}'

尝试对来自 chef 的文件执行 SED 时出现错误,我无法追踪

它从控制台运行没有问题:

sed -i.bak -e "$aolcRootPW: {SSHA}Z/+CHVP/Vx3bA2m6l0aI6uvIMhJUitpT" /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif

但是根据我的食谱:

bash 'UPDATE /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif #3' do
  code <<-EOH
     sed -i.bak -e "$aolcRootPW: {SSHA}Z/+CHVP/Vx3bA2m6l0aI6uvIMhJUitpT" /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif
  EOH
end

我收到以下错误

    ================================================================================
    Error executing action `run` on resource 'bash[UPDATE /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif #3]'
    ================================================================================

    Mixlib::ShellOut::ShellCommandFailed
    ------------------------------------
    Expected process to exit with [0], but received '1'
    ---- Begin output of "bash"  "/tmp/chef-script20151029-7070-y3iz58" ----
    STDOUT: 
    STDERR: sed: -e expression #1, char 8: unexpected `}'
    ---- End output of "bash"  "/tmp/chef-script20151029-7070-y3iz58" ----
    Ran "bash"  "/tmp/chef-script20151029-7070-y3iz58" returned 1

    Resource Declaration:
    ---------------------
    # In /var/chef/cache/cookbooks/3rd-open-ldap-server/recipes/default.rb

     64: bash 'UPDATE /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif #3' do
     65:   code <<-EOH
     66:      sed -i.bak -e "$aolcRootPW: {SSHA}Z/+CHVP/Vx3bA2m6l0aI6uvIMhJUitpT" /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif
     67:   EOH
     68: end
     69: bash 'UPDATE /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif #4' do

    Compiled Resource:
    ------------------
    # Declared in /var/chef/cache/cookbooks/3rd-open-ldap-server/recipes/default.rb:64:in `from_file'

    bash("UPDATE /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif #3") do
      action [:run]
      retries 0
      retry_delay 2
      default_guard_interpreter :default
      command "UPDATE /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif #3"
      backup 5
      returns 0
      code "     sed -i.bak -e \"$aolcRootPW: {SSHA}Z/+CHVP/Vx3bA2m6l0aI6uvIMhJUitpT\" /etc/openldap/slapd.d/cn=config/olcDatabase={2}bdb.ldif\n"
      interpreter "bash"
      declared_type :bash
      cookbook_name "3rd-open-ldap-server"
      recipe_name "default"
    end

令人困惑的是我不知道字符 8 是什么。我怀疑这是某种逃避问题 - 但我不知道在哪里。


更新(以深入了解它不存在的地方):我认为它在 sed 命令中而不是文件名中,因为此命令在 chef 没有问题的情况下工作:

bash 'UPDATE /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif #2' do
  code <<-EOH
     sudo sed -i.bak s/dc=my-domain,dc=com/dc=my,dc=lan/g /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif
  EOH
end

我怀疑问题是当您包装命令时设置了一些环境,其中 $a... 正在对它进行一些虚假的 shell var 替换。如果您只是使用单引号并放弃 \ 来尝试防止任何此类事情发生怎么办?

即:

bash 'UPDATE /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif #3' do
  code <<-EOH
     sed -i.bak -e '$aolcRootPW: {SSHA}Z/+CHVP/Vx3bA2m6l0aI6uvIMhJUitpT' /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif
  EOH
end

我需要对 sed 表达式开头的 $ 进行双重转义:

bash 'UPDATE /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif #3' do
  code <<-EOH
     sed -i.bak -e "\$aolcRootPW: {SSHA}Z/+CHVP/Vx3bA2m6l0aI6uvIMhJUitpT" /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif
  EOH
end