在bash脚本中使用时,mysqldump访问被拒绝

问题描述 投票:1回答:3

我正在尝试创建一个bash脚本,该脚本使用mysqldump创建指定为参数的数据库的备份。然而,mysqldumpaccess 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`。

如何在执行命令时删除这些引号?

mysql bash shell
3个回答
1
投票

你可以:

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

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

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


0
投票

通过.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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.