通过SSH的rsync仅保留对www-data拥有的文件的所有权

时间:2012-03-06 15:36:15

标签: linux ssh webserver rsync

我正在使用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。请注意,使用不rsync的{​​{1}}不会保留这些权限。

6 个答案:

答案 0 :(得分:21)

您还可以使用--rsync-path选项在目标主机上执行rsync:

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

这使您可以在targethost上进行user身份验证,但仍然可以通过sudo获得特权写入权限。您必须在目标主机上修改您的sudoers文件,以避免sudo请求您的密码。 man sudoers或运行sudo 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

我还没有对此进行测试,因此我不确定管道查找输出到--files-from=-的确切方式。毫无疑问,你需要进行实验。

答案 1 :(得分:3)

据我所知,如果你不是root用户,你不能将chown文件传给别人。因此,您必须rsync使用www-data帐户,因为所有文件都将使用指定用户作为所有者创建。因此,您需要chown之后的文件。

答案 2 :(得分: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密钥设置对user@10.1.1.2的访问权限,这样您就可以避免密码浮动。例如,以目标计算机上的root身份运行:

# ssh-keygen -d

然后获取文件/root/.ssh/id_dsa.pub的内容并将其添加到源计算机上的~user/.ssh/authorized_keys。您可以从目标计算机以root身份ssh user@10.1.1.2查看它是否有效。如果您收到密码提示,请检查错误日志以查看密钥无法正常工作的原因。

答案 3 :(得分: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(无论rsync完成状态如何,1x'&'都会运行chown)

答案 4 :(得分:2)

好吧,你可以完全跳过rsync的挑战,只需通过tar隧道即可。

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

您需要像Graham描述的那样设置SSH密钥。

请注意,这会处理完整目录副本,而不是rsync等增量更新。

这里的想法是:

  • 你盯上你的目录,
  • 而不是创建tar文件,将tar输出发送到stdout,
  • stdout通过SSH命令传送到另一台主机上的接收 tar,
  • 但接收tar是由sudo运行的,因此它具有设置用户名的写权限。

答案 5 :(得分:0)

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