将 rysnc 文件和文件夹复制到某个位置而不更改权限

将 rysnc 文件和文件夹复制到某个位置而不更改权限
  • 我正在使用 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,您需要尝试并实现以下目标

  1. 所有者是詹金斯(我认为你无法改变这一点)
  2. 组是www-data(这样我们可以确保nginx可以读取文件)
  3. 文件目标的权限为 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 位添加到文件夹(“目录”),以便组名称从树的根继承

相关内容