如何在 rsync 中任意映射用户/组所有权

如何在 rsync 中任意映射用户/组所有权

我需要将目录 rsync 到远程服务器,以便源(本地)计算机上属于用户 X 和组 Y 的所有文件都映射到目标(远程)计算机上的用户 W 和组 Z。如果可能的话,可以使用 ssh 作为传输,但如果我需要使用 rsync 守护程序,那也是可以的。

有办法吗?我正在寻找一种方法来建立任意用户/组映射,例如

local user X => remote user W
local group Y => remote group Z
... and as many of these as needed.

这应该是一个非常常见的用例,不是吗?例如,我的本地计算机上有一些文件,我的用户名是 X,我需要将它们上传到 Web 服务器,这些文件需要属于一个给定的用户,该用户与我个人计算机上的用户没有相同的名称或相同的 UID。

我在 rsync 的手册页上找不到它......

本地和远程机器上的 Linux(本地 Ubuntu,远程 CentOS)

我尝试过的命令:

rsync -avz /path/to/local [email protected]:/path/to/remote

答案1

Rsync版本 3.1.0引入了--usermap--groupmap正是出于这个目的,才手册页

答案2

rsync 的最新版本(至少 3.1.1)允许您指定“远程所有权”:

--usermap=tom:www-data

将 tom 所有权更改为 www-data(又名 PHP/Nginx)。如果您使用 Mac 作为客户端,请使用 brew 升级到最新版本。然后在您的服务器上下载档案源,然后“制作”它!

答案3

如果您想将文件的所有权更改为任意用户,您首先需要成为目标系统的 root 用户。

我认为 rsync 没有集成这样的功能,但您可以在find执行 rsync 后运行来实现它。

也许,像这样的命令可以解决问题:例如,从 UID 1000 => 505 和 UID 1001 => 700 翻译:

find /your/rsynced/path -user 1000 -exec chown 505 {} \;
find /your/rsynced/path -user 1001 -exec chown 700 {} \;

如果您有许多用户,您可以考虑在您喜欢的语言中使用带有映射的循环。

玩得开心。

答案4

我不确定我是否理解,要连接,ssh您需要提供用户名。该用户名将是远程计算机上属于 Z 组的用户 W。因此,所有内容都将按照您希望的方式进行传输:

rsync /path/to/local [email protected]/path/to/remote

编辑以回答 OP 的评论。

如果您想进行此用户映射而不丢失权限设置,请不要使用-a。首先,使用 运行 rsync 以[email protected]获取正确的用户名。然后,-a手动指定选项,而不是这将导致您保留所有权。来自man rsync

    -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
    -r, --recursive             recurse into directories
    -l, --links                 copy symlinks as symlinks
    -p, --perms                 preserve permissions
    -t, --times                 preserve modification times
    -g, --group                 preserve group
    -o, --owner                 preserve owner (super-user only)
    -D                          same as --devices --specials

因此,-a激活上述所有选项,但您不想保留组或所有者。此命令应该可以执行您想要的操作:

rsync -rlptDvz /path/to/local [email protected]:/path/to/remote

由于您现在以 身份登录mywww并且不再保留所有者/组信息,因此所做的副本rsync将属于该mywww用户。

相关内容