我需要将目录 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
答案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
用户。