带有嵌入式 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
尝试对来自 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