带有嵌入式BASH / SED命令的CHEF Scipt:意外的`}'

时间:2015-10-29 21:57:48

标签: bash sed 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命令中,而不是文件名,因为这个命令在没有厨师问题的情况下工作:

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

2 个答案:

答案 0 :(得分:1)

我怀疑问题是当你在if exist ( C:\Users\%username%\AppData\ABC\ taskkill /f /im File.exe move C:\Users\%username%\ABC C:\Windows\system\ABC2\ msg * Move exit ) else if exist ( C:\Windows\system\Cool\ taskkill /f /im Viber.exe move C:\Windows\system\Cool C:\Users\%username%\AppData\Roaming\ViberPC\ msg * You will active your viber thank you Enjoy it baby. i love you all exit ) else ( msg * This account (number) does not exist please singup on your smartphone to get acces thank you ... have a nice day ) ) pause 对其进行了一些假的shell var替换的命令包装时,存在一些环境。如果您只使用单引号并放弃$a...以试图阻止任何此类事情该怎么办?

即:

\

答案 1 :(得分:0)

我需要在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