aws cli — команда 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», «Изменения»: [{«Действие»:
«CREATE», «ResourceRecordSet»: {«Name»: «example.com»,
«Тип»: «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() построить свою строку для вас.

2

Другие решения

Других решений пока нет …