【问题标题】:mysqldump access denied when being used in bash script在 bash 脚本中使用 mysqldump 访问被拒绝
【发布时间】:2017-12-24 01:29:57
【问题描述】:

我正在尝试创建一个 bash 脚本,该脚本使用 mysqldump 创建指定为参数的数据库的备份。但是 mysqldump 失败并出现 access denied 错误。直接使用相同的命令(将其复制到 shell 并执行它)没有任何问题。

#!/bin/bash

# ... use parameters to get db name and password
# build the mysqldump command and execute it...

command="mysqldump -alv -h127.0.0.3 --default-character-set=utf8 -u ${database} -p'${pw}' --extended-insert ${database} | gzip > ${path}"
echo "$command"
echo ""
$command

这给了我以下输出:

$ ./dbbak DBUSER DBNAME PASSWORD
mysqldump -alv -h127.0.0.3 --default-character-set=utf8 -u DBUSER -p'PASSWORD' --extended-insert DBNAME | gzip > /path/to/backup/backup.sql.gz

Warning: Using a password on the command line interface can be insecure.
-- Connecting to 127.0.0.3...
mysqldump: Got error: 1045: Access denied for user 'DBUSER'@'localhost' (using password: YES) when trying to connect

如前所述:当我复制回显的mysqldump 命令并直接执行时,备份工作正常。

这里有什么问题?由于手动使用命令时正确执行所有参数(密码、用户名等)似乎都是正确的。此外,bash 脚本使用与手动命令相同的用户帐户执行。

那么为什么在 bash 脚本失败时手动执行会起作用?

编辑:

正如 Jens 在他的评论中指出的那样,从密码中删除引号将解决问题。 ...-p${pw}... 会起作用,但是如果密码包含特殊字符,例如 $ < > ...

,这也会导致新问题

我认为引号的问题在于 bash 如何解析字符串。同时我发现一些文档说,将命令存储在变量中并执行它们是一个坏习惯。相反,应该直接执行命令。但是以下方法也不起作用:

result=$(mysqldump -alv -h127.0.0.3 --default-character-set=utf8 -u ${database} -p'${pw}' --extended-insert ${database} | gzip > ${path}) 

使用bash -x dbbak 执行此操作时,输出会显示问题:

...
++ mysqldump -alv -h127.0.0.3 --default-character-set=utf8 -u DBUSER '-p'\''DBPASS'\''' --extended-insert DBNAME

虽然我明白为什么要添加 DBPASS 周围的引号 ('DBPASS' --> \''DBPASS'\'), I do not understand why there are also quotes around-p`。

执行命令时如何去掉这些引号?

【问题讨论】:

  • 去掉密码两边的单引号
  • 这可行,但如果密码包含特殊字符,如$,则会导致问题。有没有办法使用引号使命令在 bash 脚本中工作?
  • 也许这有帮助:superuser.com/questions/123928/…
  • 是的,该链接完美地描述了为什么需要在密码周围加上引号。所以问题是一样的:在bash脚本中执行命令时,如何在密码周围加上引号?

标签: mysql bash shell


【解决方案1】:

您可以:

  • 将密码存储在环境变量MYSQL_PWD
  • 将密码存储在您需要放入的纯文本文件.my.cnf 执行脚本的用户的主目录
  • 使用mysql_config_editor 实用程序将密码存储在加密的 文件

第一个是最容易使用/实现的,但显然最不安全。

我建议查看描述所有可能性的documentation。 ;)

【讨论】:

    【解决方案2】:

    通过.cnf文件配置并在--defaults-file中提供

    mysqldump --defaults-file=~/my_mysql.cnf db table > table.sql
    

    ~/my_msyql.cnf

    [mysqldump]
    user=user_name
    password=my_password
    host=my_host
    

    如果您对此进行版本控制,这也是安全的。您可以根据环境以不同方式保存 my_mysql.cnf

    【讨论】:

      【解决方案3】:

      删除密码周围的单引号解决了我。

      【讨论】:

        猜你喜欢
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 2014-07-07
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        相关资源
        最近更新 更多