假设我的 umask 是 0077。
我有一个目录foo
,我想对其应用特殊权限。我在其中创建的所有文件foo
都应是全球可读的,并且所有目录都应是全球可读和可执行的。
目前,如果我创建一个文件,它将是 0600,而一个目录将是 0700:
$ cd foo/
$ touch file
$ mkdir directory
$ ls -l
drwx------ 2 nfm nfm 4096 2012-01-12 16:16 directory
-rw------- 1 nfm nfm 0 2012-01-12 16:15 file
我希望文件为 0644,目录为 0755,无论我的 umask 是多少:
drwxr-xr-x 2 nfm nfm 4096 2012-01-12 16:16 directory
-rw-r--r-- 1 nfm nfm 0 2012-01-12 16:15 file
我怎样才能实现这个目标?
答案1
是的,ACL 可以做到这一点。
确保您的文件系统已使用 挂载
acl
。要检查这一点,请键入mount
。您应该会看到acl
列出的其他权限,例如/dev/sda1 on / type ext4 (rw,errors=remount-ro,acl)
如果没有使用 acl 安装,请打开
/etc/fstab
,并添加acl
到选项列表中:# /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> /dev/sda1 / ext3 noatime,errors=remount-ro,acl 0 1
现在,使用新选项重新挂载正在运行的文件系统:
mount -v -o remount /
安装 acl 实用程序。在 ubuntu/debian 上,这是:
sudo apt-get install acl
您的新朋友是
setfacl
和getfacl
。使用setfacl
更改目录的默认 acl:setfacl -d -m o:r foo
-d
设置默认值,-m
修改 acl,并o:r
授予“其他”读取权限。在目录上设置默认值大致相当于设置设置组ID在目录中,但新创建的文件不会继承组,而是继承 acl。setgid 和 acl 结合起来会非常强大,因为您可以向组授予默认权限,并让新创建的文件属于该组,从而实现有效的基于组的每个目录 umask。检查您的工作:
ls -l
现在应该显示一个额外的“+”,表示除了标准文件权限之外还存在 acl。% ls -la foo/ drwxr--r--+
您可以使用 获取有关 acl 的详细信息
getfacl
。% getfacl foo # file: foo # owner: you # group: you user::rwx group::r-- other::r-- default:user::rwx default:group::--- default:other::r--
答案2
您还可以通过设置掩码 ACL 属性来强制目录的 umask,如下所示:
setfacl -d -m mask:07 .