- 我正在使用 rsync 部署一些将由 nginx 提供服务的静态 HTML。
- 运行 rysnc 的用户是“jenkins”
- nginx 使用 www-data 组来访问该文件夹。
- 詹金斯是 www-data 的成员
我ssh
进入有问题的 Ubuntu 14.04 服务器并运行
sudo chown -R jenkins:www-data /home/jenkins/thesite
然后从另一台机器上运行
rsync -rtzh --delete --omit-dir-times _site/ jenkins@the_server.com:/home/jenkins/thesite
完成后,一些(但不是全部)文件的组现在已设置为 jenkins。所以nginx
无法访问它们。
似乎不仅仅是我更改的文件存在权限问题,但我正在使用 Jekyll 生成文件,这可能会影响或可能只是一个巨大的转移注意力的问题。
在 Windows 世界中,我会设置父文件夹的权限并告诉它让子文件夹继承。 Linux 上有类似的东西吗?还是我在用 做一些愚蠢的事情rsync
?
答案1
至少有几种方法可以解决这个问题。但首先让我尝试解释一下 Linux/Unix 的权限世界如何与 Windows 世界相对应。
windows具有可继承的权限; Linux 系统传统上不这样做(但可以使用 ACL,我现在将忽略它)。 Linux 权限分为三部分:所有者、组和其他人(“其他”)。每个都可以读取、写入和执行(文件)/搜索(文件夹)。文件的所有者是其创建者。所有者可以将组设置为所有者所属的任何组。
使用 rsync,您需要尝试并实现以下目标
- 所有者是詹金斯(我认为你无法改变这一点)
- 组是www-data(这样我们可以确保nginx可以读取文件)
- 文件目标的权限为 user:read+write、group:read、other:read,对于文件夹 user:read+write+search (“execute”)、group:read+search、other:read+search。如果您愿意,我们可以删除其他权限
我们将假设现有文件符合条件,因为您可以像这样修复这些文件:
chown -R jenkins:www-data /home/jenkins/thesite
chmod -R u+rw,g=u,g+s,o=u /home/jenkins/thesite
现在,对于 rsync 命令,我们需要忽略 Windows 文件权限并应用我们自己的标准:
rsync -rptzh --delete --omit-dir-times --chmod=u+rw,go=rX,Dg+s _site/ jenkins@the_server.com:/home/jenkins/thesite
rsync 的标志chmod
如下:
u=rw
- 所有者(“用户”)拥有(至少)读写权限go-rX
- 组和其他人(“其他”)将被删除写入权限Dg+s
- 将 group-setgid 位添加到文件夹(“目录”),以便组名称从树的根继承