美元符号在AWS上破坏mysqldump的密码

时间:2019-05-14 14:34:34

标签: php laravel amazon-web-services amazon-elastic-beanstalk

我正在Elastic Beanstalk上托管Laravel应用。我有一个运行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”,则会出现此错误:

  

命令“ mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -ptest db_name> db.sql”失败

即而不是插入“ test $ me”作为密码,而是插入“ test”。

我尝试在环境变量中的密码周围添加单引号,发生同样的事情:

  

命令“ mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -p'test'db_name> db.sql”失败

2 个答案:

答案 0 :(得分:0)

  

美元登录。但是,当密码中确实包含美元符号时,它将被切断,然后命令将失败。例如。如果密码是“ test $ me”

看起来调用使用的是未转义的字符串,然后由外壳程序解析(它也使用$表示变量)。您必须对escapeshellarg()传递的所有参数进行转义以应对该问题:

$c = sprintf(
            $command,
            escapeshellarg(config('database.connections.host')),
            escapeshellarg(config('database.connections.username')),
            escapeshellarg(config('database.connections.password')),
            escapeshellarg($destinationDatabase)
        );

答案 1 :(得分:0)

我跟随this answer,并在我的Elastic Beanstalk环境变量中为$加上了三个反斜杠:

test\\\$me