Я хотел бы вызвать следующую команду:
aws route53 change-resource-record-sets --hosted-zone-id XXX
--change-batch '{ "Comment": "2018-06-19-11:31", "Changes":
[ { "Action": "CREATE", "ResourceRecordSet": { "Name": "example.com",
"Type": "TXT", "TTL": 60, "ResourceRecords":
[ { "Value": "\"something\"" } ] } } ] }'
Это работает, когда я запускаю его на bash, но не когда я запускаю его на PHP:
$json = trim(shell_exec($cmd_aws_submit));
// or:
$json = trim(shell_exec("{$cmd_aws_submit}"));
AWS ожидает, что стоимость ("\"something\""
) для записи TXT цитируется. Я попытался процитировать это так:
$value = "\\\"" . $textvalue . "\\\"";
$value = "\"" . $textvalue . "\"";
$value = "\\'" . $textvalue . "\\'";
$value = "'" . $textvalue . "'";
Ничего из этого не работает, я всегда получаю следующую ошибку:
Ошибка анализа параметра ‘—change-batch’: неверный JSON:
Недопустимый \ escape: строка 12, столбец 23 (символ 246) JSON получил:
{«Комментарий»: «2018-06-19-11: 54», «Изменения»: [{«Действие»:
«CREATE», «ResourceRecordSet»: {«Name»: «example.com»,
«Тип»: «TXT», «TTL»: 60, «ResourceRecords»:
[{«Value»: «\» что-то \ «»}]}}]}
С другим aws
UNQUOTED днс записи значений, PHP shell_exec()
работает отлично.
Если я запускаю его на Bash, он отлично работает, используя "\"something\""
почему он не работает с PHP shell_exec()
?
Вы должны использовать родной escapeshellarg
метод для экранирования аргументов, которые вы передаете в командную строку. Это также защитит вас от атак с использованием аргументов, если вы решите включить потенциально опасные данные в строку JSON на некотором этапе.
$json = '{ "Comment": "2018-06-19-11:31", "Changes":
[ { "Action": "CREATE", "ResourceRecordSet": { "Name": "example.com",
"Type": "TXT", "TTL": 60, "ResourceRecords":
[ { "Value": "\"something\"" } ] } } ] }';
$command = "aws route53 change-resource-record-sets --hosted-zone-id XXX
--change-batch " . escapeshellarg($json);
$result = trim(shell_exec($command));
Вы также можете создать строку JSON в виде массива, а затем использовать json_encode()
построить свою строку для вас.
Других решений пока нет …