我想在文件夹内设置默认权限,以便所有新创建的文件夹和文件都具有此默认权限。
所以我做了一些研究,我发现最好的线程是这个。
因此我想出了这个小“测试”:
#!/bin/bash
# setup folder
rm -rf ./test
mkdir ./test
cd ./test
# Reset all files/folders
sudo chmod -R 0000 ./ # delete all permissions
sudo chmod -R -st ./ # remove all special bits
sudo setfacl -Rdx u::,g::,o:: ./ # remove all default user/group permissions
# set new permissions and ownership
sudo chown -R christopher:users ./ # Set user and group for all files/folders
sudo chmod -R 550 ./ # set default permissions to all files/folders
sudo chmod 750 ./ # set folder main permission
sudo setfacl -d -m u::rx ./ # set user default permission (same as 550)
sudo setfacl -d -m g::rx ./ # set group default permission (same as 550)
# test the default permissions
nano myFile # write some data in it and save
现在我想测试一下。
首先是getfacl ./
创建此输出的内容:
# file: .
# owner: christopher
# group: users
user::rwx
group::r-x
other::---
default:user::r-x
default:group::r-x
default:other::---
之后我还尝试了getfacl ./myFile
以下输出:
# file: myFile
# owner: christopher
# group: users
user::r--
group::r--
other::---
这显然不起作用,所以我有两个问题:
- 我究竟做错了什么?新创建的文件
myFile
应具有 r-xr-x--- 权限,如 setfacl 命令中指定的那样。那么为什么情况并非如此呢? - 当我设置 SUID/GUID/OUID 标志 (sst) 时,这也不起作用。但我也不太确定如何使用它们,因为定义说
set the SUID or GUID flag on a folder will inherit its own permission to new created files within the folder
。真的有许可吗?或者只有所有者用户/组? - 也许你可以帮我修改我的小脚本。但如果您这样做,仍然存在问题,即我需要新创建的文件夹的不同默认权限以及新创建的文件的默认权限。因为新创建的文件夹应始终获得 550 权限,而新创建的文件应始终获得 440 权限。在诸如此类的命令上
find -type
可以进行区别。所以我可以做类似find ./ -type d -exec chmod 550 {} \;
立即将所有文件夹的权限设置为 550 的操作。(type f
类似于文件)。但这仅适用于已创建且存在的文件夹/文件。但我需要对新创建的文件夹和文件有一些“默认”权限,但需要分别对两者进行默认权限。
答案1
默认 ACL 设置的权限会被创建文件的程序所提供的任何模式所掩盖。通常,创建常规文件的程序将权限设置为0666
(即无执行位),并让句柄umask
删除组和其他人的访问权限。对于目录,模式通常设置0777
为使得 x 位是在那里,因为经常需要它们。
创建“私人”文件(如 SSH 密钥)的程序会将权限指定为0600
,以确保除用户自己之外的任何人都无权访问。
这手动的acl(5)
说:
对象创建和默认 ACL
- 修改与文件权限位对应的访问 ACL 条目,以便它们不包含 mode 参数指定的权限中未包含的权限。
因此,由于 ACLu::
对应于文件用户的常用权限位,因此权限被创建程序所提供的内容所掩盖。 (从某种意义上说,默认的 ACL 似乎取代了 umask。)我怀疑如果您创建一个目录,您会看到它确实获得了x
您想要的 - 位。
从技术上讲,这不会影响 ACL 条目具体的用户,如 中u:foo:rwx
,但这些受到 ACL 掩码的限制。该掩码与传统的组权限位有对应关系,并且上面引用的规则似乎也适用于该掩码,使得ACL掩码受到创建文件时设置的组权限位的限制。
咱们试试吧:
$ mkdir dir ; chmod 750 dir ; setfacl -d -m u::rx -m g::rx -m u:foo:rwx dir
$ touch dir/file ; mkdir dir/subdir
创建的文件具有屏蔽的 x 位(getfacl
此处显示了位集以及应用屏蔽后的有效值):
$ getfacl dir/file
user::r--
user:foo:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::---
但目录中没有:
$ getfacl dir/subdir/
user::r-x
user:foo:rwx
group::r-x
mask::rwx
...
这可能会回答(1)和(3)。至于(2):IIRC,设置gid目录上的-bit ( g+s
) 使在该目录中创建的新文件继承团体目录的(不是模式)。粘性位 ( +t
) 控制删除不属于您的文件,实际上我不知道 setuid 位 ( u+s
) 在目录上会做什么。