我正在通过 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
那么您会想到四个选项
传输文件,以用户身份登录目标帐户
apache
。有了ssh
证书,您就可以避免嵌入密码的需要。您还可以将连接设置ssh
为拒绝除运行rsync
服务之外的任何操作。从目标主机拉取文件。您可以将此作业设置为在 cron 下频繁运行(
rsync
不进行任何工作可能是一个相对便宜的选择),或者您可以让它检查触发器,例如创建文件,并且仅在激活时运行完整的rsync
进程。在这种情况下,我将
cron
在您的目标主机上运行,每五分钟检查一次本地文件,并使用如下代码片段test -f "$HOME"/.rsync_trigger && rsync ... && rm -f "$HOME"/.rsync_trigger
用于
inotifywait
在复制文件后修复文件所有权。这需要该进程以 root 身份运行,但它可以小心地独立,以便它只能更改目标目录centos
中拥有的文件的所有权apache
。以 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 拥有的文件写入/更新到目标。