这里写目录标题
- 背景现象
- 解决方案
- 原因分析
- 面临的问题
- 解决思路
- 操作步骤
- 每个文件夹权限分配表
- 测试chmod和chown两个命令是否可行
- 写脚本实现定时同步
- 同时修改权限
- 异地同步改权限
- 在NAS上生成SSH密钥对
- 将NAS的公钥复制到Linux服务器
- 在NAS上编写同步脚本
- 在NAS上执行脚本,保存脚本
- 确保它有执行权限
- 使用 cron 进行定期备份
背景现象
使用 rsync 从一台 Linux 服务器备份文件到 NAS(网络附加存储)时,备份过来的文件的所有者和组都变成了 ,而且权限也改了。
权限与之前不一致,和源服务器的权限一样了
Linux上的权限
用户也更改了,大部分都变成了root
解决方案
原因分析
1、rsync 命令以 root 用户身份运行(图形化界面是用root登录的),导致备份的文件默认所有者是 root。
2、NAS 可能有自己的权限管理机制,并且可能不保留原始文件的所有者和组信息。
3、rsync 的 --owner 和 --group 选项可能没有启用,或者由于权限问题无法设置正确的所有者和组。
面临的问题
现在共享的一共有三个数据集,也对应三个人sync任务,为了便于理解,父数据集就叫1号文件夹,子数据集分别叫2号和3号
每个数据集权限都得重新改
解决思路
使用chmod和chown命令恢复文件权限
chmod命令:用于修改文件或目录的权限。可以使用数字权限表示法(如chmod 755 filename)或符号权限表示法(如chmod u+x filename)。
chown命令:用于修改文件或目录的所有者和所属组。例如,chown user1:group1 filename会将文件filename的所有者更改为user1,所属组更改为group1。
因为这个异地同步,采用了图形化上面自带的rsync同步,要更改权限还需要结合命令(使用图形化更改也可以,但是我这个权限有些特殊,使用命令更简单,而且我不想每次同步完还要手动的去点击图形化的界面),所以打算使用命令先进行本地定时同步并同时更改权限。
使用命令进行同步,并且每次同步之后都要进行权限修改这个操作,那就一起写到批命令里,同步结束,紧跟着做权限更改。然后再用定时任务执行一下。
操作步骤
每个文件夹权限分配表
下表是我的业务需求,我要更改其中三个的权限和用户及用户组
测试chmod和chown两个命令是否可行
chown user1:group1 filename
用户统一了,权限还不一致
chmod -R 770 "路径"
权限更改了,有一个特殊的是rsync的配置文件
使用 chmod -R 770 “路径” 命令来更改目录及其子文件和子目录的权限时,通常它会递归地应用权限到指定路径下的所有文件和目录。但是,导致 rsync 的配置文件(或任何其他特定文件)的权限没有被更改的原因可能是其特殊的属性,或者文件可能被另一个进程锁定,这可能会阻止权限更改。还可能是rsync 守护进程正在运行并且打开了配置文件,那么更改文件权限可能不会立即生效,因为守护进程可能仍然具有旧的权限。可能需要重启 rsync 守护进程来使更改生效。但是这个不影响使用,暂时先不理会了。
写脚本实现定时同步
1、创建脚本文件
首先,需要使用文本编辑器(如 nano, vim, emacs 等)来创建一个新的脚本文件。这里假设使用 vim 编辑器,并且将脚本命名为 backup.sh。
打开终端,并输入以下命令:
vim /path/to/your/scripts/backup.sh
/path/to/your/scripts/ 是你想保存脚本的目录,可以替换为自己的目录路径。
2、编辑脚本
#!/bin/bash# 设置源目录和目标目录
SOURCE_DIR="/mnt/test"
BACKUP_DIR="/mnt/dms/20/test"# 使用rsync进行备份
# -av 表示以归档模式传输,并保持所有文件属性
# --delete 表示删除目标目录中源目录中没有的文件(使目标目录成为源目录的镜像)
rsync -av --delete "$SOURCE_DIR/" "$BACKUP_DIR/"# 你可以在这里添加其他命令,比如发送备份完成的通知等
echo "Backup completed successfully."
确保将 SOURCE_DIR 和 BACKUP_DIR 替换为你自己的源目录和目标目录路径。
保存,退出编辑器
3. 为脚本添加执行权限
了使脚本能够运行,需要为其添加执行权限。在终端中,使用 chmod 命令:
chmod +x /root/backup.sh
4. 手动运行脚本以测试
在添加执行权限后,可以手动运行脚本来测试它是否按预期工作:
/path/to/your/scripts/backup.sh
应该能看到脚本执行的输出,包括 “Backup completed successfully.” 这条消息。
如果已经导航到包含该脚本的目录,可以使用 ./ 来指定当前目录:
5. 使用 cron 进行定期备份
现在,已经有了一个可以正常工作的备份脚本,可以使用 cron 来定期运行它。
打开当前用户的 crontab 文件:(一定使用这个命令,而不是vim)
crontab -e
然后,添加一行来指定你想运行脚本的时间和频率。例如,如果你想每天凌晨 1 点运行备份脚本,你可以添加以下行:
0 1 * * * /root/backup.sh
保存并退出编辑器。现在,你的脚本将按照指定的时间自动运行。
实验成功
注意事项
● 确保源目录和目标目录都是可访问的,并且rsync命令有足够的权限来读取源目录和写入目标目录。
同时修改权限
再次编辑backup.sh
chown -R 用户:用户组 路径
chmod -R 770 "路径"
保存,退出
手动测试 ./ backup.sh
检查更改结果,成功
异地同步改权限
异地和本地思路相同,可以都使用命令进行,我的需求是这样的,在NAS上建立这个脚本,用于从一台Linux服务器拉取文件(即NAS是客户端,Linux服务器是源),那么需要确保NAS能够SSH到Linux服务器,而不需要密码输入。这通常是通过在NAS上放置Linux服务器的SSH公钥(通常称为"免密码登录"或"SSH密钥认证")来实现的。
具体操作可以参考我的另一篇文章,思路一致
链接: Linux通过 SSH 使用 rsync 进行文件传输
大致思路是:
在NAS上生成SSH密钥对
将NAS的公钥复制到Linux服务器
在NAS上编写同步脚本
#!/bin/bash # Linux服务器的SSH地址和目录 REMOTE_USER="username" REMOTE_HOST="linux-server-ip" REMOTE_DIR="/path/to/source/directory" LOCAL_DIR="/path/to/target/directory" # 使用rsync从远程服务器拉取文件 rsync -avz --delete "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" "$LOCAL_DIR" # (可选)如果你需要设置特定的权限和用户/组,可以在这里添加命令 # 例如,为本地目录设置权限和用户/组 chown -R user:group "$LOCAL_DIR" chmod -R 755 "$LOCAL_DIR" # 脚本结束提示 echo "Synchronization complete."
在NAS上执行脚本,保存脚本
确保它有执行权限
chmod +x /path/to/your/script.sh
使用 cron 进行定期备份
crontab -e
添加脚本的时间和频率
0 1 * * * /root/backup.sh
注意事项
确保NAS和Linux服务器之间的网络连接是安全的,并且你信任这两个系统。
替换脚本中的username、linux-server-ip、/path/to/source/directory和/path/to/target/directory为你的实际值。