Команда 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()
построить свою строку для вас.