我目前正在编写一个备份脚本,用于登录我的生产服务器并将最新的 SQL 转储拉到我的暂存服务器。我可以轻松拉取 SQL 转储,但将最后的备份文件移动到临时文件夹时会遇到问题。
我的备份脚本用户:mysqlBackupUser
我使用此用户的主目录作为此脚本的位置并存储备份。文件夹结构如下:
/home
|- mysqlBackupUser
|- .ssh
|- backups
|- bin
我的脚本就位bin
,备份已下载到backups
目录中
该backups
目录还有其他文件夹用于组织服务器和备份类型。例如:
/backups
|-mysql
|- production1
|- production2
|-misc
|- production1
|- production2
到目前为止一切都很好,并且按预期运行。问题是当我处于(不限于)以下情况时:
/home/mysqlBackupUser/backups/mysql/production1/
当我创建名为 tmp 的目录_lastBackUp
并尝试将我以前的备份移动到其中时,我得到:
find: Failed to change directory: Permission denied
我的代码是:
local tmpBackUpDir="${LOCAL_LOCATION_DIR}/_lastBackUp/"
# Ensure the directory exist
mkdir -p "${tmpBackUpDir}"
# move any previous files to bak
find "${LOCAL_LOCATION_DIR}/" -type f -exec mv -t "${LOCAL_BAKUP_DIR}" {} \+;;
为了清楚起见:
LOCAL_LOCATION_DIR = /home/mysqlBackupUser/backups/mysql/production1
tmpBackUpDir = /home/mysqlBackupUser/backups/mysql/production1/_lastBackUp/
要了解脚本的使用方式:目前我以我的用户身份登录,并且
sudo su mysqlBackupUser
以用户身份。我不确定这是否是问题所在,我无法通过以该用户身份登录进行测试。该脚本将由 cron 运行,并将以该用户的身份(设置密钥以简化该用户的自动化)执行该过程,因此我不确定这是否真的是问题所在。
我已经验证了所有文件夹的所有权和权限,甚至 也_lastBackUp
归mysqlBackupUser
。我甚至将其设置_lastBackUp
为 777 进行测试,但仍然被拒绝权限...
我的完整错误是:
find: Failed to change directory: Permission denied
find: Failed to change directory: Permission denied
find: Failed to change directory: Permission denied
find: Failed to change directory: Permission denied
find: Failed to change directory: Permission denied
find: Failed to change directory: Permission denied
find: Failed to change directory: Permission denied
find: Failed to change directory: Permission denied
find: Failed to change directory: Permission denied
find: failed to restore initial working directory: Permission denied
每个find: Failed to change directory: Permission denied
文件都是我要移动到的_lastBackUp
感谢您对此的任何见解。
答案1
看起来错误是由于没有权限改变目录。
- 验证用户至少拥有
r-x
指向执行脚本的路径的每个文件夹。 - 验证用户至少拥有
rwx
备份所在的文件夹+文件。 - 验证用户是否有登录 shell,
$HOME
以及$PATH
。如果是,则在开始操作之前将脚本移动cd
到某个相关位置。如果没有,则使用以下方法定义所有命令和位置绝对路径。
我想不出任何其他可能的原因。
答案2
如果 mkdir 工作正常(看起来是这样的),那么如果你在父目录上运行 ls -al,那么目录的所有者是谁?在我看来,某个地方的权限出了问题。