我正在尝试创建一个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`。
执行命令时如何删除这些引号?
答案 0 :(得分:1)
You can either:
MYSQL_PWD
.my.cnf
which you need to put into
the home directory of the user that executes the scriptmysql_config_editor
utility to store the password in an encrypted
fileThe first one is the easiest to use/implement but obviously the least secure.
I recommend to take a look at the documentation where all the possibilities are described. ;)
答案 1 :(得分:0)
Configure it by .cnf file and provide it in --defaults-file
mysqldump --defaults-file=~/my_mysql.cnf db table > table.sql
In ~/my_msyql.cnf
[mysqldump]
user=user_name
password=my_password
host=my_host
This is also safe if you version this. You can save my_mysql.cnf
differently per environment.
答案 2 :(得分:0)
删除为我解决的密码周围的单引号。