Я размещаю приложение Laravel на Elastic Beanstalk. У меня есть ремесленная команда, которая работает mysqldump:
$command = 'mysqldump -h%s -u%s -p%s %s > ' . storage_path($filename);
$c = sprintf(
$command,
config('database.connections.host'),
config('database.connections.username'),
config('database.connections.password'),
$destinationDatabase
);
$this->process = new Process($c);
Это работает, когда в пароле (который я храню в переменной среды) нет знака доллара. Но когда в пароле есть знак доллара, он обрезается, и команда не выполняется. Например. если пароль "test$me", я получаю эту ошибку:
The command "mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -ptest db_name > db.sql" failed
т.е. вместо вставки «test$me» в качестве пароля он вставляет «test».
Я попытался добавить одинарные кавычки вокруг пароля в переменной среды, происходит то же самое:
The command "mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -p'test' db_name > db.sql" failed
Можете показать свой файл конфигурации?
Возможно, вам повезет больше, если вы создадите файл my.cnf, который может загрузить только файл php, и используйте его вместо этого.
Но, согласно superuser.com/questions/123928/…, вы должны иметь возможность использовать одинарные кавычки в командной строке, если в файле конфигурации также есть пароль в одинарных кавычках.






dollar sign in it. But when the password does have a dollar sign in it, it is cut off and the command then fails. E.g. if the password is "test$me"
Похоже, что вызов использует неэкранированную строку, которая затем разрешается оболочкой (которая также использует $ для обозначения переменных). Вы должны экранировать все аргументы, переданные с помощью escapeshellarg(), чтобы противостоять этому:
$c = sprintf(
$command,
escapeshellarg(config('database.connections.host')),
escapeshellarg(config('database.connections.username')),
escapeshellarg(config('database.connections.password')),
escapeshellarg($destinationDatabase)
);
@AlaaMorad: нет, это приведет к другому результату.
Он выдает этот вывод: команда «mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -p'test' db_name> db.sql» не удалась
Это указывает на то, что проблема также связана с вашим файлом конфигурации. Где вы вводите свой пароль? Дотенв? или config.php?
В переменной среды Elastic Beanstalk
что именно это означает? Можете ли вы отредактировать свой вопрос и показать конфиг, где вы устанавливаете пароль (не забудьте использовать поддельные данные)
я хочу сказать, что если это сценарий оболочки (или каким-то образом оценивается оболочкой), то вы получили $xxx часть, уже расширенную оболочкой (по умолчанию неизвестная переменная автоматически расширяется до пустой строки). В PHP это также возможно, однако вы, скорее всего, увидите уведомление PHP
Проблема связана с Elastic Beanstalk.
Я последовал за этот ответ и добавил три обратных косых черты к $ в моей переменной среды Elastic Beanstalk:
test\\\$me
Имеет ли значение добавление обратной косой черты перед $? Нравится этот 'test\$me'?