通过SSH同步(rsync)仅保留www-data拥有的文件的所有权

14

我正在使用rsync将本地服务器上的Web文件夹结构复制到远程服务器上。两台服务器都是Ubuntu Linux系统。我使用以下命令,它运行良好:

rsync -az /var/www/ user@10.1.1.1:/var/www/
本地系统和远程系统的用户名不同。从我所了解的来看,可能无法保留所有文件夹和文件的所有者和组。这没关系,但我想仅为现有于两台服务器上的“www-data”用户保留所有者和组。是否有可能?如果可以,该怎么做?
** 编辑 **
这里提到rsync能够在远程文件同步中保留所有权和组:http://lists.samba.org/archive/rsync/2005-August/013203.html ** 编辑 2 **
多亏了这里许多有用的评论和答案,我最终实现了所需的效果。假设源机器的IP为10.1.1.2,目标机器的IP为10.1.1.1,则可以从目标机器使用以下行:
sudo rsync -az user@10.1.1.2:/var/www/ /var/www/

这将保留具有共同用户名(如www-data)的文件的所有权和组。请注意,如果不使用sudo,则使用rsync无法保留这些权限。


1
你最好不要将根用户名与“root”不同。这是许多东西默认假定将保持一致的默认设置,因为在每个unix或linux系统上它总是相同的,并且已经保持了几十年。如果您的根用户名不是“root”,那么即使现在可以工作,也应该预计将来会出现故障。 - ghoti
抱歉造成困惑,但我上面提到的用户名称是具有sudo特权的用户,而不是“root”用户。当然,仍然存在root帐户,但通常我选择不使用它们。我希望只使用sudo就能够完成我需要做的事情。 - jeffery_the_wind
你能澄清一下,你是否在传输过程中保留特定的所有者:组,还是保留所有所有者:组设置?作为非root用户,我可以传输文件,但它们总是由rsync设置的非root用户拥有。作为root用户,所有所有者:组都被很好地保留了,我只是不想以root身份运行rsync(实际上是lsyncd)。 - Hal50000
6个回答

24

您也可以使用--rsync-path选项在目标主机上以sudo身份运行rsync:

# rsync -av --rsync-path="sudo rsync" /path/to/files user@targethost:/path

这使你可以在目标主机上以user身份进行身份验证,但仍通过sudo获得特权写入权限。您需要修改目标主机上的sudoers文件以避免sudo请求您的密码。运行man sudoerssudo visudo了解说明和示例。

您提到您想保留由www-data拥有的文件的所有权,但不包括其他文件。如果这是真的,那么除非您实现chown或第二次运行rsync来更新权限,否则您可能会感到不幸。没有办法告诉rsync仅保留一个用户的所有权。

话虽如此,您应该阅读有关rsync的--files-from选项的内容。

rsync -av /path/to/files user@targethost:/path
find /path/to/files -user www-data -print | \
  rsync -av --files-from=- --rsync-path="sudo rsync" /path/to/files user@targethost:/path

我没有测试过这个,所以不确定将find的输出导入--files-from=-会如何工作。 您无疑需要进行实验。


这确实很有道理,但我尝试使用--chown=user:group选项确切地这样做,但它不起作用。添加--super也没有帮助。我想知道是否使用--rsync-path="sudo rsync"--chown不兼容。我还没有尝试直接使用root用户进行ssh,但我通常更喜欢从另一个用户账户sudo。 - user1115652
我找到了答案:似乎除非你同时设置 --owner --group,否则 --chown 不起作用。这有点违反直觉,因为后者选项是关于从源保留所有者和组的。此外,--chown 的 man 页面没有提到这一点,也没有发出警告。而 --usermap 部分确实提到了这一点。 - user1115652

3
本地系统和远程系统的root用户是不同的。
这是什么意思?root用户的uid为0。他们有何不同?
任何具有对要复制的目录的读取权限的用户都可以确定哪些用户名拥有哪些文件。只有root可以更改正在写入的文件的所有权。
您当前在源计算机上运行命令,这会限制您的写入权限为user@10.1.1.1关联的权限。相反,您可以尝试在目标计算机上以root身份运行命令。您在源计算机上的读取访问权限不是问题。
因此,在目标计算机(10.1.1.1)上,假设源计算机为10.1.1.2:
# rsync -az user@10.1.1.2:/var/www/ /var/www/

确保两台设备上的组相匹配。

另外,使用DSA或RSA密钥设置对用户@10.1.1.2的访问权限,以避免密码泄露。例如,在目标设备上作为root用户执行以下命令:

# ssh-keygen -d

然后,将文件 "/root/.ssh/id_dsa.pub" 的内容添加到源机器上的 "~user/.ssh/authorized_keys" 中。 您可以从目标机器作为 root 运行 "ssh user@10.1.1.2" 命令查看其是否有效。 如果出现密码提示,请检查您的错误日志以查看密钥为何无法正常工作。

用户名不同,但我在两个账户上都是用户。我会尝试这个,谢谢。 - jeffery_the_wind
这也不起作用。文件的同步已经成功,但目标机器上文件的所有者和组仍然只是执行rsync命令的用户名。即使我使用了“-o”选项。 - jeffery_the_wind
正如我之前所说,只有root用户才能为其写入的文件设置用户名。因此,如果您想设置用户名,请以root身份运行rsync。从rsync手册页面可以看到,-o选项是“仅超级用户”,也就是root用户。 - Graham

3

我有一个类似的问题,通过欺骗rsync命令解决了它:

rsync -avz --delete root@x.x.x.x:/home//domains/site/public_html/ /home/domains2/public_html && chown -R wwwusr:wwwgrp /home/domains2/public_html/

&& 在rsync成功完成后运行chown命令(1个'&'将无论rsync完成状态如何都会运行chown)。


这实际上会将rsync放到后台,并导致chown在rsync完成之前运行。如果有一个'&',则无论rsync的完成状态如何,都会运行chown。 - Joel Koglin

3
据我所知,如果您不是root用户,就无法将文件的所有权赋予其他人,因此您需要使用www-data账户进行rsync,因为所有文件都将以指定用户的身份创建。因此,您需要在之后使用chown命令更改文件的所有权。

感谢您的帮助。是的,我想避免在之后编写一个脚本来更改它们的所有权,因为我希望这一切都可以在一个 .sh 文件中自动化处理。我不想在 .sh 文件中保存密码。 - jeffery_the_wind
如果可以避免,您永远不应该在服务器上的任何文件中保存密码。正如Graham所概述的那样,请使用SSH密钥。此外,xato和Graham是完全正确的 - 只有root才能设置正在编写的文件的用户名。如果您想保留所有权,则必须以root身份运行rsync。 - ghoti
@ghoti - 是的,我使用SSH密钥,它们非常好,但如果您想在ssh上执行像sudo chown www-data file.html这样的操作,它们是不够的。您仍然需要重新输入sudo密码。因此,我将不得不像其他答案中建议的那样从目标机器运行脚本。如果我以sudo权限运行脚本,它应该可以工作。 - jeffery_the_wind
@jeffery_the_wind...我认为你可能错过了我的答案,关于--rsync-path选项。即使您从源服务器运行命令,您也可以sudo目标rsync。当然,您需要修改sudoers文件以避免sudo的密码请求。 - ghoti

2

好的,你可以跳过rsync的挑战,只需通过tar隧道完成此操作。

sudo tar zcf - /path/to/files | \
  ssh user@remotehost "cd /some/path; sudo tar zxf -"

你需要按照Graham所描述的方式设置SSH密钥。

请注意,这处理的是完整目录复制,而不是像rsync那样的增量更新。

这里的想法是:

  • 将您的目录打包成tar文件,
  • 不是创建一个tar文件,而是将tar输出发送到stdout,
  • 该stdout通过SSH命令传输到另一台主机上的接收tar文件中,
  • 但是该接收tar由sudo运行,因此具有特权写访问权限以设置用户名。

是的,但这样你就失去了进行增量备份的机会。对于源代码的任何更改,您都必须每次上传整个文件。效率相当低下。 - Dakatine
是的。正如你所看到的,我在这个回答中已经注明了。OP没有提到他/她使用rsync的原因。有些人会将其用于增量更新,有些人则会将其用于一次性复制,以确保权限匹配。如果增量更新是您的首要任务,那么这不是您的答案。但是,值得注意的是,它可能是其他问题的一个可能解决方案。 - ghoti

-1

rsync 版本 3.1.2

我主要在本地使用 Windows,所以这是我用来与服务器(Debian)同步文件的命令行:

user@user-PC /cygdrive/c/wamp64/www/projects

$ rsync -rptgoDvhP --chown=www-data:www-data --exclude=.env --exclude=vendor --exclude=node_modules --exclude=.git --exclude=tests --exclude=.phpintel --exclude=storage ./website/ username@hostname:/var/www/html/website

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接