在bash脚本中使用mysqldump时拒绝访问
我试图创建一个bash脚本,它使用在bash脚本中使用mysqldump时拒绝访问,mysql,bash,shell,Mysql,Bash,Shell,我试图创建一个bash脚本,它使用mysqldump创建指定为参数的数据库备份。但是mysqldump失败,出现访问被拒绝错误。直接使用相同的命令(将其复制到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 --de
mysqldump
创建指定为参数的数据库备份。但是mysqldump
失败,出现访问被拒绝
错误。直接使用相同的命令(将其复制到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脚本失败时手动执行会起作用呢?
编辑:
正如延斯在评论中指出的那样,删除密码中的引号将解决问题..-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'\),但我不理解为什么在
-p`周围也有引号
如何在执行命令时去掉这些引号?您可以:
- 将密码存储在环境变量中
MYSQL\u PWD
- 将密码存储在需要输入的纯文本文件
.my.cnf
中
执行脚本的用户的主目录
- 使用
mysql\u config\u编辑器
实用程序将密码存储在加密的
文件
第一个是最容易使用/实现的,但显然是最不安全的
我建议看一看描述所有可能性的地方。;) 通过.cnf文件进行配置,并在
在~/my\u msyql.cnf中
[mysqldump]
user=user_name
password=my_password
host=my_host
这也是安全的,如果你的版本。您可以根据不同的环境保存my_mysql.cnf
。删除为我解决的密码周围的单引号。删除密码周围的单引号这可以工作,但如果密码包含特殊字符,如$
,则会导致问题。是否有一种方法可以使用引号并使命令在bash脚本中工作?也许这会有所帮助:是的,该链接完美地描述了为什么密码周围需要引号。所以问题是一样的:在bash脚本中执行命令时,如何获取密码周围的引号?
[mysqldump]
user=user_name
password=my_password
host=my_host