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


17

我需要将目录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 root@myhost.com:/ path / to / remote


1
始终包括您的操作系统。解决方案通常取决于所使用的操作系统。您是否使用Windows,Linux,Unix,OSX,BSD?哪个版本?
13年

Answers:


21

Rsync 版本3.1.0为此专门引入了--usermap--groupmap选项。请参见手册页


很高兴知道。肯定有一个用例场景。例如,我有两台Icinga服务器,我需要将配置文件从主服务器单向同步化。但是主节点上的icinga与从节点上的icinga是不同的uid。因此,很高兴rsync可以处理此问题。
2014年

版本说明:Ubuntu v16.04具有v3.1.1,CentOS 7具有v3.1.2,但是CentOS 6具有v3.0.6。这对于较新的发行版非常有用。
jimp

4

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

--usermap=tom:www-data

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


对我来说,它的工作方式是--chown = tom:www-data
Federico Galli

0

如果要将文件所有权更改为任意用户,则首先需要在目标框中成为root用户。

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

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

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

如果您有很多用户,则可以考虑使用具有偏好语言的循环和映射。

玩得开心。


好的,所以没有办法让rsync做到这一点。令人惊讶的是,在我看来如此明显的需求。
matteo

1
@matteo,请谨慎使用。如果远程计算机上有一个ID为1000或1001的用户,则在远程位置上可能有他们合法拥有的文件,将它们扔掉可能会导致问题。
terdon

@terdon远程计算机上怎么会有一个没有名字的用户?(因为列出文件时显示的是ID而不是名称,这意味着用户没有名称,对吗?)
matteo

1
@matteo不,每个用户都有一个用户ID和一个名称。在大多数基于Debian的系统中(可能还有其他系统),第一个默认用户是用户1000。尝试id在您的计算机上运行以查看。因此,如果您使用这样的ID,则假定远程计算机上没有用户具有相同的ID,这很可能不正确。
terdon

就我而言,服务器上没有UID 1000的用户,至少它不在/ etc / passwd中列出。这就是我的猜测,因为当我列出带有“ ls -la”的文件时,属于1000的文件(这是本地计算机上rsync -avz的结果,其中用户1000是我的默认用户“ teo”)显示为“ 1000”作为所有者。如果有一个具有该ID的用户,并且其名称为“ Someone”,那么文件的所有者将在ls输出中显示为“ Someone”,对吗?无论如何,这是一个有用的警告,谢谢。
matteo

-1

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

rsync /path/to/local userX@remote.com/path/to/remote

编辑以回答OP的评论。

如果要执行此用户映射并且不丢失权限设置,请不要使用-a。首先,使用rsync运行mywww@myhost.com以获取正确的用户名。然后,-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 mywww@myhost.com:/path/to/remote

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


不,我执行rsync -avz / path / to / local root@myhost.com:/ path / to / remote。我的问题是,如何将本地计算机上属于用户“ x”的文件重新映射到服务器上的用户“ w”?在我的计算机上,我的文件属于“ teo”。在服务器上甚至没有一个名为“ teo”的用户,我需要该用户成为apache使用的用户,例如“ mywww”;和该组相同。默认情况下,rsync将尝试将所有者保留为“ teo”,并且由于没有此类用户,它将保留UID,从而导致文件属于服务器上不存在的用户“ 1000”
matteo

顺便说一句,同时,我需要按照-a选项保留文件权限。我的意思是,任何使我无法保留文件权限的解决方案(即777文件仍为777,600文件仍为600)都无法解决问题
matteo

@matteo这是因为-a启用了保留所有者和组选项。看到我更新的答案。
terdon

1
@matteo请在提问时解释您的实际需求。这样,我们就不会浪费时间提供不完整的答案。下次,记住:i)包括您使用的实际命令(rsync默认情况下不保留任何内容-a,您对它的使用)ii)清楚地说明您所拥有的所有约束,您刚刚提到了一个用户,直到您最后发表评论为止,并且iii )提及您的操作系统。无论如何,这样做的方法rsync是将一组文件复制为mywww@remote,将下一组文件复制为root@remote
terdon

1
@matteo真正不清楚的是您使用的-a是保留所有权。您提供的示例建议您仅需要为一位用户执行此操作。无论如何,我建议您使用rsync,只列出要复制给每个用户的不同文件,然后运行多个rsync,并使用相关的用户名连接到远程计算机。这样会更简单,更安全。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.