将文件夹从一台 Unix 服务器复制到另一台,并更新所有者 ID

将文件夹从一台 Unix 服务器复制到另一台,并更新所有者 ID

我正在使用所述方法这里将目录从一台 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 权限在新服务器上运行了这些文件。

这对我来说是有效的,但是,

  • 这不是一个好的解决方案,
  • 它需要相当多的手工工作,
  • 并要求您知道哪些用户和组拥有目录中的文件。

相关内容