在 CentOS 7 上,我使用 cloud-init 来使用需要 YAML 格式的 DigitalOcean API 来生成 Droplet。
我的大部分部分工作正常,但很难转义下面“runcmd”中运行的命令:
#!/bin/sh
set -e # Stop on first error
curl -X POST https://api.digitalocean.com/v2/droplets \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer '$api_key'' \
-d '{
"name":"'$droplet_name'",
"region":"'$region'",
"size":"'$size'",
"image":"'$image'",
"ssh_keys":'$root_ssh_pub_key',
"backups":false,
"ipv6":false,
"private_networking":false,
"user_data":"
#cloud-config
users:
- name: SomeUser
groups: wheel
shell: /bin/bash
ssh-authorized-keys:
- ssh-dss AAAABBBBCCCCDDDDD...
runcmd:
- sed -i -e '$aAllowUsers SomeUser' /etc/ssh/sshd_config
- sed -i -e '/PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
- service sshd restart
"}'
我收到的错误是:
curl: (6) Could not resolve host: no
curl: (3) [globbing] unmatched close brace/bracket in column 63
答案1
使用heredoc 进行此类输入。并且您需要转义换行符和引号,因为它们在您的appliaction/json
构造中是不允许的。
user_data=$(awk -v 'ORS=\\n' 1 <<'HERE' | sed 's/"/\\"/g'
#cloud-config
users:
- name: SomeUser
groups: wheel
shell: /bin/bash
ssh-authorized-keys:
- ssh-dss AAAABBBBCCCCDDDDD...
runcmd:
- sed -i -e '$aAllowUsers SomeUser' /etc/ssh/sshd_config
- sed -i -e '/PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
- service sshd restart
HERE
)
curl -X POST https://api.digitalocean.com/v2/droplets \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $api_key" \
-d - <<HERE
{
"name": "$droplet_name",
"region": "$region",
"size": "$size",
"image": "$image",
"ssh_keys": "$root_ssh_pub_key",
"backups": false,
"ipv6": false,
"private_networking": false,
"user_data": "$user_data"
}
HERE
答案2
您在命令行选项中使用单引号,-d
既可以指定 分隔的字符串$variable
,也可以引用第二个命令的参数sed
。
因为$aAllowUsers SomeUser
这可能是您想要的,但因为/PermitRootLogin/s/^.*$/PermitRootLogin no/
这可能不是您想要/bin/sh
扩展的。在其中添加反斜杠应该会有所帮助:
- sed -i -e \'/PermitRootLogin/s/^.*$/PermitRootLogin no/\' /etc/ssh/sshd_config
对于标量值中间有单引号的列表项,YAML 不应出现任何问题。