通过 ssh 同步具有 apache 权限的文件

通过 ssh 同步具有 apache 权限的文件

我正在通过 apache 运行 rsync 来同步资产目录

rsync -avz -e 'ssh -l rsync -i /home/rsync/.ssh/rsync -o StrictHostKeyChecking=no' /var/www/html/site/Uploads centos@$IP:/var/www/html/site/Uploads

这工作正常,但所有权从 apache 更改为 centos,因为它是用户。我可以为 apache 用户设置密钥,但是该用户无法登录,因此不起作用。

我怎样才能让 rsync 以 apache 身份运行以保留所有权,或者以 centos 用户身份运行并以 apache 身份维护所有者(cron 不适用于我的情况)。

答案1

目标目录中文件的所有权完全由用于创建/传输它们的目标帐户决定。 (普通帐户无法更改文件的所有权。)

如果您希望目标文件由以下人员拥有,apache那么您会想到四个选项

  1. 传输文件,以用户身份登录目标帐户apache。有了ssh证书,您就可以避免嵌入密码的需要。您还可以将连接设置ssh为拒绝除运行rsync服务之外的任何操作。

  2. 从目标主机拉取文件。您可以将此作业设置为在 cron 下频繁运行(rsync不进行任何工作可能是一个相对便宜的选择),或者您可以让它检查触发器,例如创建文件,并且仅在激活时运行完整的rsync进程。

    在这种情况下,我将cron在您的目标主机上运行,​​每五分钟检查一次本地文件,并使用如下代码片段

    test -f "$HOME"/.rsync_trigger && rsync ... && rm -f "$HOME"/.rsync_trigger
    
  3. 用于inotifywait在复制文件后修复文件所有权。这需要该进程以 root 身份运行,但它可以小心地独立,以便它只能更改目标目录centos中拥有的文件的所有权apache

  4. 以 root 身份运行来复制文件rsync。并不理想,但如果其他方法都失败的话可能是必要的。

答案2

因此,我发现的最好方法是让用户仅具有该命令和 use 的 sudo 访问权限--rsync-path='sudo rsync'。例如:

rsync -avz -e 'ssh -l rsync -i /home/rsync/.ssh/rsync -o StrictHostKeyChecking=no' /path/ --rsync-path='sudo rsync' [email protected]:/path/

答案3

Rsync 有一个选项numeric-ids,您可以在这里利用。

但有两件事:确保在两台服务器上,您的 apache 用户具有相同的数字 ID;并确保运行 rsync 的用户可以将 apache 拥有的文件写入/更新到目标。

相关内容