使用 rsync 进行服务器文件夹同步
本指南介绍如何使用 rsync
实现服务器文件夹同步,包含以下要求:
- 不保留文件的 所有者(owner) 和 用户组(group)。
- 配置 SSH 免密登录以避免输入密码。
- 同步时将源文件夹内容直接同步到目标文件夹,不在目标路径下创建源文件夹。
1. 基本 rsync 命令
以下是用于同步的 rsync
命令,满足不保留所有者和用户组的要求:
rsync -rltDvz --no-owner --no-group --progress source_folder/ user@remote_host:/destination_folder/
命令解释
-r
:递归同步子目录和文件。-l
:保留符号链接。-t
:保留文件时间戳。-D
:保留设备文件和特殊文件(若需要)。-v
:详细输出,显示同步过程。-z
:压缩传输数据,节省带宽。--no-owner
:不保留文件的所有者。--no-group
:不保留文件的用户组。--progress
:显示每个文件的传输进度。source_folder/
:源文件夹,末尾斜杠表示同步文件夹内容(而非文件夹本身)。user@remote_host:/destination_folder/
:目标服务器和路径。
同步行为
- 不创建源文件夹:由于
source_folder/
带斜杠,源文件夹内容直接同步到/destination_folder/
,不会在目标路径下创建source_folder
子文件夹。- 示例:
source_folder/
包含file1.txt
和subfolder/
,同步后/destination_folder/
包含:/destination_folder/ ├── file1.txt └── subfolder/
- 示例:
- 所有者和用户组:目标文件的拥有者和用户组将使用远程服务器上运行
rsync
的用户默认值(通常是user
和其默认组)。
2. 配置 SSH 免密登录
rsync
通过 SSH 传输数据,若每次同步都需要密码,可通过 SSH 密钥认证实现免密登录。
步骤
-
生成 SSH 密钥对(在本地机器):
ssh-keygen -t rsa -b 4096
- 接受默认路径(
~/.ssh/id_rsa
和~/.ssh/id_rsa.pub
)。 - 直接按回车,不设置密钥密码(或设置密码后使用
ssh-agent
)。
- 接受默认路径(
-
将公钥复制到远程服务器:
ssh-copy-id user@remote_host
- 替换
user
和remote_host
为实际用户名和服务器地址。 - 或者手动复制:
- 查看公钥:
cat ~/.ssh/id_rsa.pub
- 登录远程服务器,追加到
~/.ssh/authorized_keys
:ssh user@remote_host mkdir -p ~/.ssh echo "你的公钥内容" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh
- 查看公钥:
- 替换
-
测试免密登录:
ssh user@remote_host
- 若无需密码即可登录,配置成功。
-
运行 rsync:
- 执行同步命令,无需输入密码:
rsync -rltDvz --no-owner --no-group --progress source_folder/ user@remote_host:/destination_folder/
- 执行同步命令,无需输入密码:
3. 测试同步
在正式同步前,建议使用 --dry-run
模拟运行,检查文件列表和目标路径:
rsync -rltDvz --no-owner --no-group --progress --dry-run source_folder/ user@remote_host:/destination_folder/
扩展 同步完成 重启远程 docker
ssh user@remote_host "docker restart <你的容器名称>"
4. 注意事项
- 权限:
- 确保远程服务器的
/destination_folder/
对user
有写入权限。 - 远程
~/.ssh/
目录权限为700
,authorized_keys
文件权限为600
。
- 确保远程服务器的
- 网络:
- 确保本地和远程服务器的 SSH 端口(默认 22)可达。
- 若使用非标准端口(例如 2222),需指定:
rsync -rltDvz -e "ssh -p 2222" --no-owner --no-group --progress source_folder/ user@remote_host:/destination_folder/
- 安全性:
- 保护本地
~/.ssh/id_rsa
文件(权限600
)。 - 若设置了密钥密码,可使用
ssh-agent
:eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa
- 保护本地
- 性能:
- 若网络带宽充足,可去掉
-z
以降低 CPU 开销。
- 若网络带宽充足,可去掉
5. 自动化同步(可选)
使用 cron
实现定时同步。例如,每小时同步一次:
- 编辑 crontab:
crontab -e
- 添加以下行:
0 * * * * rsync -rltDvz --no-owner --no-group --progress source_folder/ user@remote_host:/destination_folder/
6. 常见问题
- “Permission denied (publickey)”:
- 检查
~/.ssh/authorized_keys
是否包含正确公钥。 - 确认远程服务器 SSH 配置(
/etc/ssh/sshd_config
)启用PubkeyAuthentication yes
。
- 检查
- 仍提示密码:
- 确保公钥正确复制,且本地私钥路径正确。
- 文件未同步:
- 确认
source_folder/
和/destination_folder/
路径正确,注意斜杠的影响。
- 确认