You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用rsync更新文件所有者并保留源端权限?

解决rsync跨服务器同步时保留源端文件所有权的问题

这个场景太常见了——跨不同用户体系的服务器用rsync同步文件,结果目标端的文件所有权全乱了,毕竟两边的UID/GID不对应。别担心,我们可以通过rsync的参数来精准控制所有权的同步逻辑,分两种情况来处理:

情况1:源和目标的用户名/组名完全对应(只是UID/GID不同)

如果源服务器上的文件属于alice:dev,目标服务器上也有同名的alice用户和dev组(只是它们的数字ID不一样),那你只需要在rsync命令里加上--no-numeric-ids参数就行。

默认情况下,rsync会同步文件的数字UID/GID,这就导致目标端的UID对应到了完全不同的用户。而--no-numeric-ids会让rsync转而使用用户名和组名来匹配设置所有权,完美解决ID不对应的问题。

举个实际的命令例子:

rsync -avz --no-numeric-ids user@source-server:/data/source-files/ user@dest-server:/data/target-files/

这里解释下关键参数:

  • -a:归档模式,自动保留文件的权限、时间戳、符号链接等元数据
  • -v:verbose模式,同步过程中会显示详细日志,方便排查问题
  • -z:传输时压缩数据,适合跨网络同步,节省带宽
  • --no-numeric-ids:核心参数,强制rsync用用户名/组名而非数字ID设置所有权

⚠️ 注意:执行这个命令的用户需要有修改目标端文件所有权的权限,通常建议用root用户或者在目标端给rsync配置sudo权限,否则可能会因为权限不足导致所有权设置失败。

情况2:源和目标的用户名/组名不对应,需要自定义映射

如果源端的用户/组在目标端是不同的名称(比如源端是alice:dev,目标端是alice_srv:server_dev),那可以用--usermap和--groupmap参数来指定一对一的映射关系。

比如这样写命令:

rsync -avz --usermap=alice:alice_srv --groupmap=dev:server_dev user@source-server:/data/source-files/ user@dest-server:/data/target-files/

如果有多个用户或组需要映射,用逗号分隔就行:

rsync -avz --usermap=alice:alice_srv,bob:bob_srv --groupmap=dev:server_dev,ops:server_ops user@source-server:/data/source-files/ user@dest-server:/data/target-files/

额外注意事项

  • 如果目标端不存在你要同步的用户/组,rsync会无法设置对应的所有权,这时候你需要先在目标服务器上创建好对应的用户和组,再执行同步命令。
  • 如果你用root用户执行rsync,一定要记得加上--no-numeric-ids,否则root默认会同步数字ID,又回到了最初的问题。

内容的提问来源于stack exchange,提问作者István Radics

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:40:37