我正在使用所述方法这里将目录从一台 Unix 服务器复制到另一台(均为 Ubuntu 14.04):
rsync -aruv localfolder/ user@server:destination/
我需要保留相同的所有者和权限,但新机器上的用户 ID 可能不同。我认为这就是所描述的方法对我来说不起作用的原因:所有文件都获得所有者my-user:my-user
(假设我正在使用my-user@server
)以将文件复制到服务器。
所以,基本上,我需要做的就是复制文件夹(这样做了),然后,对于每个文件,检查新机器上同名用户的 ID 是什么,并使用新 ID 更新新机器上的所有者。
这可能吗?或者有更简单的方法可以做到这一点?
这这是我最后做的,但这不是一个很好的解决方案,Michael Kjörling 的回答应优先考虑。
答案1
您正在寻找的此行为由 rsync 的-o
(--owner) 开关控制,可能与 一起控制--no-numerics-ids
。手册页对 --owner 的描述如下(我强调):
-o, --owner
此选项使 rsync 将目标文件的所有者设置为与源文件相同,但前提是接收 rsync 以超级用户身份运行(另请参阅 --super 和 --fake-super 选项)。如果没有此选项,则新文件和/或传输文件的所有者将设置为接收端的调用用户。这所有权保留将默认关联匹配的名称,但在某些情况下可能会重新使用 ID 号(另请参阅
--numeric-ids
选项以了解完整讨论)。
有一个类似的选项-g
(--group)可以用于群组。
然而,两者都应该-a
意味着你还需要更多的东西。这个“更多的东西”在选项描述中的这个小细节中有详细说明,在我看来很容易被忽略:
仅当接收 rsync 以超级用户身份运行时
因此接收 rsync 必须以 root 身份运行。当您考虑这一点时,这很有意义,因为只有 root 能够将文件的所有权更改为任意用户(这基本上就是您要求做的事情)。
-a
因此,请确保远程 rsync 守护程序以 root 身份运行,并且在使用(或)开关时应尽可能保留文件所有权(基于用户和组名)-og
。
答案2
这是我最后做的,但不是一个巧妙的解决方案。
幸运的是,我知道只有用户 ftp、www-data、my-user、root 和组 ftp、www-data、root 拥有的文件。
因此,我在旧机器上运行了(在我复制的文件夹的基础中)
find . -user ftp -print > temp-user.ftp.txt
find . -user www-data -print > temp-user.www-data.txt
find . -user my-user -print > temp-user.my-user.txt
find . -user root -print > temp-user.root.txt
find . -group ftp -print > temp-group.ftp.txt
find . -group www-data -print > temp-group.www-data.txt
find . -group root -print > temp-group.root.txt
现在,例如,temp-user.ftp.txt
包含 ftp 用户拥有的所有文件的列表。并且temp-group.ftp.txt
是 ftp 组所有文件的列表。例如,temp-user.ftp.txt
可能看起来像这样:
./some-file.txt
./a-directory
./a-directory/lower-level-file.mp3
使用一些编辑器使其看起来像这样(例如,在文件的开头和结尾处手动替换\n
并"\nchown *** "
清理一点):
chown ftp "./some-file.txt"
chown ftp "./a-directory"
chown ftp "./a-directory/lower-level-file.mp3"
当然,在这里进行更改chown ftp
以匹配文件-temp-group.www-data.txt
将获得chgrp www-data
,等等。
我使用 root 权限在新服务器上运行了这些文件。
这对我来说是有效的,但是,
- 这不是一个好的解决方案,
- 它需要相当多的手工工作,
- 并要求您知道哪些用户和组拥有目录中的文件。