我了解保留 rsync 的权限。 但是,就我而言,我的本地计算机没有网络服务器所需的文件的用户。因此,当我进行 rsync 时,我需要所有者和组在网络服务器上是 apache,但在本地计算机上是我的用户名。有什么建议吗?
我想澄清并准确解释我需要做什么。
home
,用户帐户为 michael
。server
,用户帐户为 remote
和用户帐户 apache
。目前情况: 我的网站在
home
上与所有者 michael
以及在 server
上与所有者 apache
。 home
需要使用用户 michael
并且 server
需要使用用户 apache
任务: 将我在
home
上的网站同步到 server
,但所有文件的所有者为 apache
和组 apache
问题: rsync 将保留权限、所有者和组;但是,我需要所有文件都属于 apache 的所有者。我知道不保留所有者会将用户的所有者置于
server
上,但由于该用户是 remote
,因此它使用它而不是 apache
。我无法与用户 rsync apache
(这会很好),但我不愿意公开的安全风险。
我关于如何解决的唯一想法:在每次
rsync
手动chown -R
和chgrp -R
之后,但这是一个巨大的系统,这需要很长时间,特别是因为这是要投入生产的。
有人知道该怎么做吗?
我当前使用的命令
rsync
:
rsync --progress -rltpDzC --force --delete -e "ssh -p22" ./ [email protected]:/website
如果您有权访问 rsync v.3.1.0 或更高版本,请使用 --chown 选项:
rsync -og --chown=apache:apache [src] [dst]
类似问题的答案中的更多信息:ServerFault:Rsync 命令问题,所有者和组权限不会更改
你可以在接收机器上组合一些技巧来获得所有权——在 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== [email protected]
然后你的“家庭”机器上的 rsync 命令将类似于
rsync -av --delete -e 'ssh -i ~/.ssh/apache-rsync apache@server' ./ /website
还有其他方法可以给这只猫剥皮,但在我看来,这是最清晰且涉及最少的解决方法。它可以防止获得 apache 的 shell,这当然是最大的安全问题。如果你真的坚决反对允许 ssh 作为 apache,还有其他方法......但这就是我所做的。
此处参考:http://ramblings.narrabilis.com/using-rsync-with-ssh,http://www.sakana.fr/blog/2008/05/07/securing-automated-rsync-over -ssh/
使用
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
在这里阅读更多内容:
rsync 的最新版本(至少 3.1.1)允许您指定“远程所有权”:
--usermap=tom:www-data
将 tom 所有权更改为 www-data(又名 PHP/Nginx)。如果您使用Mac作为客户端,请使用brew升级到最新版本。在您的服务器上,下载档案源,然后“制作”它!
我主要在本地使用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 选项