34

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

我想澄清一下我需要做什么。

我的个人电脑:名为“home”,用户帐户为“michael” 我的网络服务器:名为“server”,用户帐户为“remote”,用户帐户为“apache”

当前情况:我的网站在所有者“michael”的“家”上和所有者“apache”的“服务器”上。“home”需要使用用户“michael”,“server”需要使用用户“apache”

任务:将我在“家”上的网站同步到“服务器”,但所有文件的所有者都归“apache”和“apache”组

问题:rsync 将保留权限、所有者和组;但是,我需要所有文件都是 apache 的所有者。我知道不保留所有者会将用户的所有者放在“服务器”上,但由于该用户是“远程”,所以它使用它而不是“apache”。我无法与用户 'apache' 进行 rsync(这很好),但我不愿意公开存在安全风险。

我对如何解决的唯一想法:每次rsync手动chown -R和之后chgrp -R,但这是一个巨大的系统,这需要很长时间,特别是因为这将投入生产。

有谁知道如何做到这一点?

我使用的当前命令rsync

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

5 回答 5

73

如果您有权访问 rsync v.3.1.0 或更高版本,请使用--chown选项:

rsync -og --chown=apache:apache [src] [dst]

此处类似问题的答案中的更多信息:ServerFault:Rsync 命令问题,所有者和组权限不会改变

于 2015-01-05T23:42:51.507 回答
14

您可以在接收机器上组合一些技巧来获得所有权 - 从 cron 运行 'chmod -R apache /website' 将是一个有效但相当笨拙的选择 - 但相反,我建议安全地允许 rsync -over-ssh-as-apache。

您将为此创建一个专用的 ssh 密钥对:

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

然后将 ~/.ssh/apache-rsync.pub 带到网络服务器,将其放入 ~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

然后你的“家庭”机器上的 rsync 命令就像

rsync -av --delete -e 'ssh -i ~/.ssh/apache-rsync apache@server' ./ /website

还有其他方法可以给这只猫剥皮,但在我看来,这是最清晰的,涉及的解决方法也最少。它可以防止将 shell 作为 apache,这是最大的安全问题,natch。如果您真的反对允许 ssh 作为 apache,还有其他方法……但这就是我所做的。

此处参考:http ://ramblings.narrabilis.com/using-rsync-with-ssh,http : //www.sakana.fr/blog/2008/05/07/securing-automated-rsync-over-ssh/

于 2012-06-25T20:58:16.787 回答
11

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

--usermap=tom:www-data

将 tom 所有权更改为 www-data(又名 PHP/Nginx)。如果您使用 Mac 作为客户端,请使用 brew 升级到最新版本。在您的服务器上,下载档案源,然后“制作”它!

于 2014-12-03T10:16:50.767 回答
7

仅当远程用户对目标目录具有写访问权限时,使用的解决方案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

于 2019-10-11T10:18:31.060 回答
2

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 选项

于 2018-10-17T15:08:00.950 回答