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
명령은 두 개의 셸 변수 값을 인라인 JSON 문서 domain
에 삽입하는 데 사용됩니다. domainName
이 두 변수는 명령줄에서 두 개의 내부 jq
변수 $domain
와 를 초기화하는 데 사용됩니다 $name
. 이는 삽입되어야 하는 문자열에서 JSON 문서에 의해 참조됩니다.
이렇게 하면 특수 이스케이프가 필요한 모든 문자가 문서의 JSON 문자열에 포함되도록 올바르게 이스케이프됩니다.
이 문자열 끝에 큰따옴표를 삽입한 이유는 이것이 필요한지 모르기 때문입니다. JSON 파서는 데이터를 읽을 때 이스케이프된 따옴표를 올바르게 디코딩합니다.