aws route53 change-resource-record-sets
現在のDMARCレコードを更新するコマンドを提供するために使用する次のJSON文字列を取得しました。ご覧のとおり、TXT値には;
。
JSON="{ \"Comment\": \"Updating TXT record in $domain\",
\"Changes\": [ { \"Action\": \"UPSERT\", \"ResourceRecordSet\": { \"Name\":
\"_dmarc.${domainName}\", \"Type\": \"TXT\", \"TTL\":
3600, \"ResourceRecords\": [ { \"Value\": "\"v=DMARC1\; p=reject\; pct=100\"" } ] } } ] }"
echo $JSON
完全なJSON文字列の代わりに次の出力を取得するとき。に達するとすぐに解析が停止するようです;
。
{ "Comment": "Updating TXT record in ",
"Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name":
"_dmarc.contoso.com", "Type": "TXT", "TTL":
3600, "ResourceRecords": [ { "Value": "v=DMARC1;
\\;
andなどを使ってセミコロンを脱出するさまざまな方法を試しましたが、運がありません\";\"
でした。私がここで何を間違っているのか?
答え1
一重引用符と二重引用符を混在させると、混乱しにくく見えず、使いやすくなります。
JSON='{ "Comment": "Updating TXT record in $domain",
"Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name":
"_dmarc.${domainName}", "Type": "TXT", "TTL":
3600, "ResourceRecords": [ { "Value": "v=DMARC1; p=reject; pct=100" } ] } } ] }'
これはうまくいきます。例:
$ JSON='{ "Comment": "Updating TXT record in $domain",
"Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name":
"_dmarc.${domainName}", "Type": "TXT", "TTL":
3600, "ResourceRecords": [ { "Value": "v=DMARC1; p=reject; pct=100" } ] } } ] }'
$
$ echo $JSON | jq .
{
"Comment": "Updating TXT record in $domain",
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "_dmarc.${domainName}",
"Type": "TXT",
"TTL": 3600,
"ResourceRecords": [
{
"Value": "v=DMARC1; p=reject; pct=100"
}
]
}
}
]
}
$
答え2
ここで問題は、セミコロンをエスケープするのではなく、セミコロンの後のスペースをエスケープすることです。文字列をこれに置き換えると
{ \"Value\": "\"v=DMARC1\;\ p=reject\;\ pct=100\"" }
これで文字列が正しくエコーされます!
{ "Value": "v=DMARC1; p=reject; pct=100" }
答え3
末尾の引用符とバックスラッシュの中にはエスケープ文字がありません。 JSONドキュメント文字列の周りに一重引用符を使用すると、引用符の管理が簡単になります。
シェル変数の値をJSONドキュメントに挿入したいようです。これを行うのが最も安全ですjq
。
$ domain=my.domain.example.com
$ domainName=some-domain-name
$ JSON=$( jq -c -n --arg domain "$domain" --arg name "$domainName" '
{ "Comment": "Updating TXT record in \($domain)",
"Changes": [ {
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "_dmarc.\($name)", "Type": "TXT", "TTL": 3600,
"ResourceRecords": [ { "Value": "\"v=DMARC1; p=reject; pct=100\"" } ]
} } ] }' )
このjq
コマンドは、2つのシェル変数の値をインラインJSONドキュメントdomain
に挿入するために使用されます。domainName
これら2つの変数は、コマンドラインで2つの内部jq
変数$domain
を初期化するために使用されます$name
。これは、挿入する必要がある文字列のJSONドキュメントによって参照されます。
これにより、特殊なエスケープを必要とするすべての文字が文書のJSON文字列に含まれるように正しくエスケープされます。
この文字列の末尾に二重引用符を挿入したのは、これが必要かどうかわからないためです。 JSONパーサーは、データを読み取るときにエスケープされた引用符を正しくデコードします。