我可以使用 ACL 覆盖我的 umask,从而使给定目录中创建的所有文件都可读吗?

我可以使用 ACL 覆盖我的 umask,从而使给定目录中创建的所有文件都可读吗?

假设我的 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 可以做到这一点。

  1. 确保您的文件系统已使用 挂载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 /
    
  2. 安装 acl 实用程序。在 ubuntu/debian 上,这是:

    sudo apt-get install acl
    
  3. 您的新朋友是setfaclgetfacl。使用setfacl更改目录的默认 acl:

    setfacl -d -m o:r foo
    

    -d设置默认值,-m修改 acl,并o:r授予“其他”读取权限。在目录上设置默认值大致相当于设置设置组ID在目录中,但新创建的文件不会继承组,而是继承 acl。setgid 和 acl 结合起来会非常强大,因为您可以向组授予默认权限,并让新创建的文件属于该组,从而实现有效的基于组的每个目录 umask。

  4. 检查您的工作: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 .

相关内容