通过SSH的rsync保留所有权只有www数据拥有的文件

我正在使用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不会保留这些权限。

您还可以使用--rsync-path选项来sudo目标主机上的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 

我没有测试过这个,所以我不确定管道find的输出到--files-from=-工作方式。 你无疑需要做实验。

据我所知,如果你不是root的话,你不能把文件传给别人。 所以你将不得不rsync使用www-data帐户,因为所有的文件将被创建与指定的用户作为所有者。 所以你需要在之后播放这些文件。

我有一个类似的问题,并作弊的rsync命令,

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

当rsync成功完成时,&&对文件夹运行chown(1x'&'将运行chown而不管rsync完成状态如何)

本地系统和远程系统的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的内容,并将其添加到源计算机上的/root/.ssh/id_dsa.pub ~user/.ssh/authorized_keys 。 您可以从目标机器以root用户身份ssh user@10.1.1.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通过SSH命令传送到另一个主机上的接收 tar,
  • 但接收tar由sudo运行,所以它有权限写访问来设置用户名。