Команда AWS CLI работает на Bash, но не с PHP shell_exec()

Я хотел бы вызвать следующую команду:

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", "Изменения": [ { "Action": "CREATE", "ResourceRecordSet": { "Name": "example.com", "Type": "TXT", "TTL": 60, "ResourceRecords": [ { "Value": "\"что-то\"" } ] } } ] }

С другим aws UNQUOTED днс записи значений, PHP shell_exec() работает отлично.

Если я запускаю его на Bash, он отлично работает, используя "\"something\"" почему он не работает с PHP shell_exec()?

1 ответ

Решение

Вы должны использовать родной 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() построить свою строку для вас.

Другие вопросы по тегам