我有一个部署脚本(基于 capifony),它为 Symfony2 安装设置特定服务器上的权限。它包含以下两个命令来对多个目录执行此操作:
setfacl -R -m u:www-data:rwx -m u:`whoami`:rwX app/cache
setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwX app/cache
这两个命令位于 Symfony2 站点上,作为修复权限的一种方法,但是,它们看起来与我惊人地相似。因此,我查看了 的联机帮助页setfacl
,根据我的理解,第二个命令的作用与第一个命令的作用完全一样,但带有一个附加选项(我不太明白)。我的问题是,我的假设正确吗?如果是这样,如果我删除第一个命令是否会产生相同的效果?
答案1
第一个命令将更改任何预先存在的文件/目录的权限。第二个命令中的命令-d
对于设置任何目录的默认权限至关重要,这反过来将为这些目录中的任何文件提供默认的 ACL 集。
笔记:在这两种情况下,命令都将通过-R
开关递归运行。
关于-d
开关,来自setfacl
手册页:
-d, --default
All operations apply to the Default ACL. Regular ACL entries in the
input set are promoted to Default ACL entries. Default ACL entries
in the input set are discarded. (A warning is issued if that happens).
这段摘录也很好地解释了这一点:
ACL 有两种类型:访问 ACL 和默认 ACL。访问 ACL 是特定文件或目录的访问控制列表。默认ACL只能与目录关联;如果目录中的文件没有访问 ACL,它将使用该目录的默认 ACL 规则。默认 ACL 是可选的。
来源:8.2.设置访问 ACL。
例子
假设我有这个目录结构。
$ tree
.
|-- dir1
| |-- dirA
| | `-- file1
| `-- fileA
`-- file1
2 directories, 3 files
setfacl
现在让我们使用问题中的第一个命令设置权限:
$ setfacl -R -m u:saml:rwx -m u:samtest:rwX .
结果如下:
$ getfacl dir1/ file1
# file: dir1
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x
# file: file1
# owner: saml
# group: saml
user::rw-
user:saml:rwx
user:samtest:rwx
group::rw-
mask::rwx
other::r--
如果没有-dR
在此处运行命令,您的 ACL 将不会覆盖新目录:
$ mkdir dir2
$ getfacl dir2
# file: dir2
# owner: saml
# group: saml
user::rwx
group::rwx
other::r-x
但是如果我们删除这个目录并运行命令setfacl -dR ...
并重复上面的操作:
$ rmdir dir2
$ setfacl -dR -m u:saml:rwx -m u:samtest:rwX .
现在权限看起来完全不同:
$ getfacl dir1/ file1
# file: dir1/
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:saml:rwx
default:user:samtest:rwx
default:group::rwx
default:mask::rwx
default:other::r-x
# file: file1
# owner: saml
# group: saml
user::rw-
user:saml:rwx
user:samtest:rwx
group::rw-
mask::rwx
other::r--
现在我们新创建的目录将获得这些“默认”权限:
$ mkdir dir2
$ getfacl dir2
# file: dir2
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:saml:rwx
default:user:samtest:rwx
default:group::rwx
default:mask::rwx
default:other::r-x
拥有这些权限dir2
现在也会对其中的文件强制执行这些权限dir2
:
$ touch dir2/fileA
$ getfacl dir2/fileA
# file: dir2/fileA
# owner: saml
# group: saml
user::rw-
user:saml:rwx #effective:rw-
user:samtest:rwx #effective:rw-
group::rwx #effective:rw-
mask::rw-
other::r--