Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash脚本中使用mysqldump时拒绝访问_Mysql_Bash_Shell - Fatal编程技术网

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

在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

我试图创建一个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 --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