如何更改rsync的所有者

48

我理解保留rsync的权限。但是在我的情况下,本地计算机没有文件所需的用户用于web服务器。因此,在rsync时,我需要所有者和组在web服务器上为apache,但在我的本地计算机上为我的用户名。有什么建议吗?

我想澄清一下以准确说明我需要完成的任务。

我的个人计算机:命名为“home”,使用者账户为“michael”

我的Web服务器:命名为“server”,使用者账户为“remote”和“apache”

当前情况:我的网站在“home”上,拥有者为“michael”,在“server”上,拥有者为“apache”。 'home'需要使用用户'michael','server'需要使用用户'apache'

任务:将“home”上的我的网站rsync到“server”,但所有文件的拥有者都是'apache',组是'apache'

问题:rsync将保留权限、所有者和组;但是,我需要所有文件的所有者为apache。我知道不保留所有者会将'user on server'的所有者放置在服务器上,但由于该用户是'remote',因此它使用该用户而不是'apache'。我不能使用用户'apache'进行rsync(这很好),但这是我不愿意打开的安全风险。

我唯一的解决方法是在每次rsync之后手动使用“chown -R”和“chgrp -R”,但这是一个巨大的系统,而且需要很长时间,特别是因为这将进入生产。

有人知道如何做到这一点吗?

我当前用于rsync的命令:

rsync --progress -rltpDzC --force --delete -e "ssh -p22" ./ remote@server.com:/website

1
你对文件传输的方式有点含糊不清——我猜是通过ssh?你是在ssh到web服务器上,如果是的话,使用了哪个用户?你能提供一下你现在运行的命令吗? - Adam
1
我更新了我的问题以提供更深入的解释。是的,我正在使用ssh将文件同步到远程Web服务器。 - Michael Ozeryansky
5个回答

90

无法合并跨站点的内容,David - 感谢你提供的跨链接。 - Shog9
5
似乎客户端和服务器端都需要运行3.1.0+才能使用 --chown - Jacket
感谢!我在本地机器上使用Homebrew更新了rsync,这个方法非常有效。 - OregonTrail
请注意,您还需要检查当前用户是否有运行该chown的权限。(通过手动运行“chown apache:apache filename”进行检查) - Flimm

14

你可以在接收机上拼凑一些技巧来获得所有权,例如在cron中运行“chmod -R apache /website”可以是一个有效但相当笨拙的选项,但我建议安全地允许rsync-over-ssh-as-apache。

你需要为此创建一个专用的ssh密钥对:

ssh-keygen -f ~/.ssh/apache-rsync

然后将~/.ssh/apache-rsync.pub带到Web服务器上,将其放入~apache/.ssh/authorized_keys中并仔细指定允许的命令。像以下这样,在一行上完成所有操作:

command="rsync --server -vlogDtprCz --delete . /website",from="IP.ADDR.OF.SENDER",no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAABKEYPUBTEXTsVX9NjIK59wJ+fjDgTQtGwhATsfidQbO6u77dbAjTUmWCZjKAQ/fEFWZGSlqcO2yXXXXXXXXXXVd9DSS1tjE6vAQaRdnMXBggtn4M9rnePD2qlR5QOAUUwhyFPhm6U4VFhRoa3wLvoqCVtCV0cuirB6I45On96OPijOwvAuz3KIE3+W9offomzHsljUMXXXXXXXXXXMoYLywMG/GPrZ8supIDYk57waTQWymUyRohoQqFGMzuDNbq+U0JSRlvLFoVUZ5Piz+gKJwwiFwwAW2iNag/c4Mrb/BVDQAyEQ== comment@email.address

然后在你的“home”机器上使用rsync命令,形式大致如下:

rsync -av --delete -e 'ssh -i ~/.ssh/apache-rsync apache@server' ./ /website
有其他方法可以解决这个问题,但在我看来,这是最清晰且涉及最少变通的方式。它防止将shell作为apache使用,这是最大的安全问题,自然而然。如果你真的坚决反对允许ssh作为apache,那么还有其他方法……但这就是我做的方法。
参考资料:http://ramblings.narrabilis.com/using-rsync-with-sshhttp://www.sakana.fr/blog/2008/05/07/securing-automated-rsync-over-ssh/

1
谢谢。我不知道SSH安全性可以针对特定命令进行设置。 - Michael Ozeryansky

12

使用rsync --chown USER:GROUP [src] [dst]的解决方案只有在远程用户对目标目录具有写访问权限时才有效,而在大多数情况下并非如此。

以下是另一种解决方案:

概述

(srcmachine)  (rsync)   (destmachine)
  srcuser    -- SSH -->   destuser
                             |
                             | sudo su jenkins
                             |
                             v
                          jenkins

假设您想使用rsync:

  • 从:
    • 机器:srcmachine
    • 用户:srcuser
    • 目录:/var/lib/jenkins
  • 到:
    • 机器:destmachine
    • 用户:destuser建立SSH连接
    • 目录:/tmp
    • 最终文件所有者:jenkins

解决方案

rsync --rsync-path 'sudo -u jenkins rsync' -avP --delete /var/lib/jenkins destuser@destmachine:/tmp

点击此处阅读更多:

https://unix.stackexchange.com/a/546296/116861


这很干净,而且运行得非常好!现在应该将其推荐/接受为答案。 - LittleTiger

11

rsync 的最新版本(至少3.1.1)允许您指定“远程所有者”:

--usermap=tom:www-data

更改所有权为www-data(也称为PHP / Nginx)。如果您使用的是Mac作为客户端,请使用brew升级到最新版本。在服务器上,下载归档源代码,然后“make”它!


谢谢!我会去查看的。 - Michael Ozeryansky
你还需要指定-og,并且需要检查当前用户是否有执行该操作的权限。 - Flimm

3

rsync版本3.1.2

我主要在本地使用windows,因此这是我用于与服务器(debian)同步文件的命令行:

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

$ rsync -rptgoDvhnP --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

-n:执行一个试运行,不做任何更改。要真正执行命令,请删除-n选项。


你还需要检查当前用户是否有执行 chown 操作的权限。 - Flimm

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