使用 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.txtsubfolder/,同步后 /destination_folder/ 包含:
      /destination_folder/
      ├── file1.txt
      └── subfolder/
      
  • 所有者和用户组:目标文件的拥有者和用户组将使用远程服务器上运行 rsync 的用户默认值(通常是 user 和其默认组)。

2. 配置 SSH 免密登录

rsync 通过 SSH 传输数据,若每次同步都需要密码,可通过 SSH 密钥认证实现免密登录。

步骤

  1. 生成 SSH 密钥对(在本地机器):

    ssh-keygen -t rsa -b 4096
    
    • 接受默认路径(~/.ssh/id_rsa~/.ssh/id_rsa.pub)。
    • 直接按回车,不设置密钥密码(或设置密码后使用 ssh-agent)。
  2. 将公钥复制到远程服务器

    ssh-copy-id user@remote_host
    
    • 替换 userremote_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
        
  3. 测试免密登录

    ssh user@remote_host
    
    • 若无需密码即可登录,配置成功。
  4. 运行 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/ 目录权限为 700authorized_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 实现定时同步。例如,每小时同步一次:

  1. 编辑 crontab:
    crontab -e
    
  2. 添加以下行:
    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/ 路径正确,注意斜杠的影响。