setfacl:这两个命令是否相同?


10

我有一个部署脚本(基于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,据我了解,第二个命令与第一个命令的功能完全相同,但有一个附加选项(我不太了解)。我的问题是,我的假设正确吗?如果是这样,如果我删除了第一个命令,是否会有相同的效果?

Answers:


15

第一个命令将更改任何现有文件/目录的权限。-d第二个命令中的in对设置所有目录的默认权限至关重要,这将为这些目录中的所有文件提供默认的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规则。默认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--

嗯,仅是为了确认一下,您的意思是如果我们有一个app/cache包含名为的目录的目录dev,则将第一个命令应用于该目录,但不对第二个命令应用?如果以后再添加另一个目录(例如prod),第二个命令将设置权限?如果不是这种情况,我应该能够跳过第二条命令吗?
霍希·萨迪克2014年

1
@HoshSadiq-否-R是递归命令,因此权限适用。该-d警卫如果有人创建一个目录或将一些目录到树后面,这样它也将有这样的ACL应用。
slm

那很棒!让事情变得更加清晰:)谢谢!
霍什·萨迪克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.