在我的 ubuntu 服务器中我想对我的数据库进行 mysql 备份,但是出现以下错误:
run-backup.sh: 10: run-backup.sh: cannot open 38: No such file
我在我的主目录中创建了一个 sql-backup 目录,所以我不知道这个错误意味着什么......
另外,有没有一种方法可以让 mysql 不要求输入 mysql 密码,因为我已经在 shellscript 文件中提供了 $dbpass。
这是我的 shell 脚本文件(已更改凭据):
#!/bin/bash
##this script will backup mysql and upload it to google drive
##directory name
dirname=/home/GabotronES/sql-backups
##database name
database=wooloveapp
##database username
dbuser=GabotronES
##database password
dbpass=xxxxxxxxxxxxxxxxxxxxxxxx
## rclone remote name
remoteName=gabotrones
##spaces folder name
bucketFoldername=sql-backups
##todays date to add to new zip filename
datestring=$(date +\%Y_\%m_\%d_\%H)
mysqldump -u $dbuser -p$dbpass $database | gzip > "${dirname}/${database}-${datestring}.sql.gz"
##wait for 10 seconds
sleep 10
rclone --config=/home/GabotronES/gabotron.conf copy "${dirname}/${database}-${datestring}.sql.gz" $remoteName:$bucketFoldername
exit 0;
提前致谢。
答案1
如果行号正确,则表明错误出在赋值语句中dbpass=xxxxxxxxxxxxxxxxxxxxxxxx
由于 RHS 不受引号保护,因此 shell 将尝试对其进行解释。例如,如果密码以 结尾,<38
它将尝试从38
当前目录中命名的文件重定向标准输入,并且(假设不存在这样的文件)您将收到如下错误:
$ bash -c 'dbpass=xxxxxxxxxxxxxxxxxxxxx<38'
bash: 38: No such file or directory
(在 bash 中)
$ sh -c 'dbpass=xxxxxxxxxxxxxxxxxxxxx<38'
sh: 1: cannot open 38: No such file
(在sh
)
解决方案是确保正确引用作业右侧的字符串:
dbpass='xxxxxxxxxxxxxxxxxxxxxxxx'
出于类似的原因,你也应该双倍的引用变量扩展,例如mysqldump -u "$dbuser" -p"$dbpass" "$database"
有关更详细的讨论(包括其他 shell 略有不同的规则),请参阅忘记在 bash/POSIX shell 中引用变量的安全隐患