如何使用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
相关产品推荐
相关产品推荐

