在 yaml 中寻找正确转义 sed 命令的提示

在 yaml 中寻找正确转义 sed 命令的提示

我很难找到为什么以下几行“代码”会破坏我的 cloud-init 配置的问题。基本上,我调用一个子对象作为 DigitalOcean API 的一部分,它具有 YAML 格式 - 我得到了大部分工作,但能够缩小一些错误,我将其归结为以下几行:

sed -i -n '/<Directory \/>/\{p;:a;N;/<\/Directory>/!ba;s/.*\n/    Options -Indexes\n    AllowOverride none\n    Require all denied\n/\};p'  /etc/httpd/conf/httpd.conf

sed -i -e '$a\ \n#Grant localhost  access to query or modify\nrestrict 127.0.0.1\nrestrict ::1' /etc/ntp.conf

sed -i -e '$a\ \n#Add local clock as backup\nserver 127.127.1.0\nfudge 127.127.1.0 stratum 10' /etc/ntp.conf

如果直接应用在远程 shell 中,它们都可以正常工作,但如果通过 DigitalOcean API(子对象和 YAML),它们往往会崩溃 - 我假设我不符合 YAML 格式,但看不到我错过了什么转义。

有什么提示吗?

顺便说一句:查看 cloud-init-output.log 我可以看到创建的 yam blob 写入如下:

- sed -i -e '$a#Add local clock as backup
server 127.127.1.0
fudge 127.127.1.0 stratum 10' /etc/ntp.conf

这多少让我觉得无论如何我都需要找到逃离的方法\n。这可能是问题所在吗?我该如何逃避这个?

答案1

我不是 100% 确定您可以指定多个命令作为 runcmd 的参数,但如果您这样做,您应该将其设为 YAML 中的文字标量:

runcmd: |
  sed -i -n '/<Directory \/>/\{p;:a;N;/<\/Directory>/!ba;s/.*\n/    Options -Indexes\n    AllowOverride none\n    Require all denied\n/\};p'  /etc/httpd/conf/httpd.conf
  sed -i -e '$a\ \n#Grant localhost  access to query or modify\nrestrict 127.0.0.1\nrestrict ::1' /etc/ntp.conf
  sed -i -e '$a\ \n#Add local clock as backup\nserver 127.127.1.0\nfudge 127.127.1.0 stratum 10' /etc/ntp.conf

要查看 YAML 解析器如何处理此内容,您可以往返 yaml 并测试它。如果以上内容在文件中input.yml那么

  yaml rt input.yml

如果无法正确往返,将会抱怨。

确保从文件上传此数据,这样就不会出现由 shell(或 python、perl 等)引起的其他转义问题


1这是使用yaml附带的实用程序完成的鲁梅尔.yaml我是其中的作者。

相关内容