6.3 目录及文件高级权限管理

对目录或文件的所有者、拥有组和其他用户配置权限只是Linux权限体系中最基础的内容,下面是一些Linux权限体系中高级属性的配置方法。

6.3.1 权限掩码

在Windows中新建的目录及文件会自动继承上级目录的权限,这点与Linux是完全不一样的,在6.1.3 中已经说明新建目录及文件默认的权限。如果觉得这样的默认配置不能满足需要,可以通过修改umask值(权限掩码)来改变默认行为。

在Linux内核级别新建文件的默认权限是666,也就是说文件的所有者权限是可读(r=4)、可写入(w=2);文件的拥有组权限是可读(r=4)、可写入(w=2);其他用户的权限是可读(r=4)、可写入(w=2)。

在Linux内核级别新建目录的默认权限是777,也就是说目录的所有者权限是可读(r=4)、可写入(w=2)、可执行(x=1);目录的拥有组权限是可读(r=4)、可写入(w=2)、可执行(x=1);其他用户的权限是可读(r=4)、可写入(w=2)、可执行(x=1)。

umask值是一个三位的整数,其中百位是所有者权限掩码;十位是拥有组权限掩码;个位是其他用户权限掩码。当用户在新建目录或文件时真正的权限会使用Linux内核级别默认权限减去umask值。比如在RHEL 5.x中root用户默认的umask值是“022”,那么新建的文件默认权限就应该是666-022;一般用户默认的umask值是“002”,那么新建的文件默认权限就应该是666-002。通过“umask”命令可以查看当前用户的umask值。

        [root@srv tmp]# id
        uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
        [root@srv tmp]# umask
        0022

● 使用-S选项使得在umaks命令在显示权限掩码时使用r、w、x的方法。

        [root@srv ~]# umask -S
        u=rwx,g=rx,o=rx

提示

在显示的umask值是一个四位的整数,现在先忽略开头的“0”。其意义在后续章中讲述。

可以使用“umask权限掩码”命令修改现有用户的umask值。使用umask命令修改的内容在重新启动后会失效,如果希望永久生效可以将该命令放入“~/.bashrc”文件中。

        [root@srv tmp]# id
        uid=0(root)                                                                gid=0(root)
    groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
        [root@srv tmp]# umask
        0022
        [root@srv tmp]# touch jack
        [root@srv tmp]# ll
        total 0
        -rw-r--r-- 1 root root 0 Feb 15 17:13 jack
        [root@srv tmp]# umask 011
        [root@srv tmp]# touch chloe
        [root@srv tmp]# ll
        total 0
        -rw-rw-rw- 1 root root 0 Feb 15 17:15 chloe
        -rw-r--r--1 root root 0 Feb 15 17:13 jack

6.3.2 特殊权限

在生产情况中对于文件系统权限的需求是多种多样的,Linux的文件系统完全可以满足这样的需要,除了普通的可读、可写入、可执行权限以外还包括一些特殊的权限。

1.SUID属性

passwd命令可以用于更改用户的密码,一般用户可以使用这个命令修改自己的密码。但是保存用户密码的/etc/shadow文件的权限是400,也就是说只有文件的所有者root用户可以写入,那为什么其他用户也可以修改自己的密码呢?这就是由于Linux的文件系统中的文件有SUID属性。

        [root@srv ~]# ll /etc/shadow
        -r-------- 1 root root 1128 Feb 15 14:33 /etc/shadow

SUID属性只能运用在可执行文件上,当用户执行该执行文件时,会临时拥有该执行文件所有者的权限。passwd命令启用了SUID功能,所以一般用户在使用passwd命令修改密码时,会临时拥有了passwd命令所有者root用户的权限,这样一般用户才可以将自己的密码写入/etc/shadow文件。在使用“ls-l”或“ll”命令浏览文件时,如果可执行文件所有者权限的第三位是一个小写的“s”就表明该执行文件拥有SUID属性。

        [root@srv ~]# ll /usr/bin/passwd
        -rwsr-xr-x 1 root root 22960 Jul 17  2006 /usr/bin/passwd

如果在浏览文件时,发现所有者权限的第三位是一个大写的“S”则表明该文件的SUID属性无效,比如将SUID属性给一个没有执行权限的文件。

2.SGID属性

SGID与SUID不同,SGID属性可以应用在目录或可执行文件上。当SGID属性应用在目录上时,该目录中所有建立的文件或子目录的拥有组都会是该目录的拥有组。如“/charles”目录的拥有组是charles,当“/charles”目录拥有SGID属性时,任何用户在该目录中建立的文件或子目录的拥有组都会是charles;当SGID属性应用在可执行文件上时,其他用户在使用该执行文件时就会临时拥有该执行文件拥有组的权限。如/sbin/apachectl文件的拥有组是httpd,当/sbin/apachectl文件有SGID属性时,任何用户在执行该文件时都会临时拥有用户组httpd的权限。在使用“ls-l”或“ll”命令浏览文件或目录时,如果拥有组权限的第三位是一个小写的“s”就表明该执行文件或目录拥有SGID属性。

        [root@srv tmp]# ll
        total 4
        drwxr-sr-x 2 root root 4096 Feb 15 22:25 fringe
        -r-xr-sr-x 1 root root  6144 Feb 15 22:25 jack

如果在浏览文件时,发现拥有组权限的第三位是一个大写的“S”则表明该文件的SGID属性无效,比如将SGID属性给一个没有执行权限的文件。

3.Sticky属性

Sticky属性只能应用在目录,当目录拥有Sticky属性所有在该目录中的文件或子目录无论是什么权限只有文件或子目录所有者和root用户能删除。比如当用户oliva在“/charles”目录中建立一个文件并将该文件权限配置为777,当/charles目录拥有Sticky属性时,只有root和oliva用户可以将该文件删除。在使用“ls -l”或“ll”命令浏览目录时,如果其他用户权限的第三位是一个小写的“t”就表明该执行文件或目录拥有Sticky属性。

        [root@srv tmp]# ll
        total 4
        drwxrwxrwt 2 root root 4096 Feb 15 22:34 fringe

4.配置SUID/SGID/Sticky属性

配置普通权限时可以使用字符或数字,SUID、SGID、Sticky也是一样。使用字符时s表示SUID和SGID、t表示Sticky;4表示SUID、2表示SGID、1表示Sticky。在配置这些属性时还是使用chmod命令。

● 当前目录目前情况。

        [root@srv tmp]# ll
        total 52
        drwxr-xr-x 2 root root 4096 Feb 15 22:47 csi
        drwxr-xr-x 2 root root 4096 Feb 15 22:47 dexter
        drwxr-xr-x 2 root root 4096 Feb 15 22:46 fringe
        drwxr-xr-x 2 root root 4096 Feb 15 22:46 house
        -r-xr-xr-x 1 root root 5120 Feb 15 22:46 jack
        -r-xr-xr-x 1 root root 3072 Feb 15 22:50 kate
        drwxr-xr-x 2 root root 4096 Feb 15 22:56 lost
        -r-xr-xr-x 1 root root 6144 Feb 15 22:48 oliva
        -r-xr-xr-x 1 root root 9216 Feb 15 22:51 shannon
        为文件jack增加SUID属性。
        [root@srv tmp]# chmod u+s jack

● 为文件oliva增加SUID属性。在使用数字表示时,原来的三位不变,只是增加了一个千位专门用于SUID、SGID、Sticky属性。下面的4就是SUID属性。

        [root@srv tmp]# chmod 4555 oliva

● 为目录csi增加SGID属性。

        [root@srv tmp]# chmod g+s csi/

● 为目录dexter增加SGID属性。

        [root@srv tmp]# chmod 2755 dexter/

● 为文件kate增加SUID和SGID属性,6=4(SUID)+2(SGID)。

        [root@srv tmp]# chmod 6555 kate

● 为目录fringe增加Sticky属性。

        [root@srv tmp]# chmod o+t fringe/

● 为目录house增加Sticky属性。

        [root@srv tmp]# chmod 1755 house/

● 为目录lost增加SGID和Sticky属性,3=2(SGID)+1(Sticky)。

        [root@srv tmp]# chmod 3755 lost/

● 执行上述更改命令后当前目录的情况。

        [root@srv tmp]# ll
        total 52
        drwxr-sr-x 2 root root 4096 Feb 15 22:47 csi
        drwxr-sr-x 2 root root 4096 Feb 15 22:47 dexter
        drwxr-xr-t 2 root root 4096 Feb 15 22:46 fringe
        drwxr-xr-t 2 root root 4096 Feb 15 22:46 house
        -r-sr-xr-x 1 root root 5120 Feb 15 22:46 jack
        -r-sr-sr-x 1 root root 3072 Feb 15 22:50 kate
        drwxr-sr-t 2 root root 4096 Feb 15 22:56 lost
        -r-sr-xr-x 1 root root 6144 Feb 15 22:48 oliva
        -r-xr-xr-x 1 root root 9216 Feb 15 22:51 shannon

● 取消目录lost的SGID属性。

        [root@srv tmp]# chmod g-s lost/

在使用umask命令显示当前的权限掩码时,千位的“0”就是表示SUID、SGID、Sticky属性。

提示

在有些资料上SUID、SGID被翻译为“强制位”,Sticky被翻译为“冒险位”。

6.3.3 ACL

在学习了为文件或目录的所有者、拥有组、其他用户配置可读、可写入、可执行权限后,是不是觉得Linux文件系统所提供的权限功能没有Windows中的NTFS权限功能强大呢?的确如果只能对所有者、拥有组、其他用户三种对象配置权限是无法满足用户的需求的,所以这时我们就需要使用到Linux文件系统中所提供的ACL(访问控制列表)功能。利用Linux文件系统提供的ACL功能为系统中已存在的任何用户或用户组指定其对系统中文件或目录的权限。

通过ACL功能配置的权限优先级高于通过chmod命令配置的普通权限,如某文件的所有者和拥有组是charles,该文件的普通权限是755,也就是说除了charles和root用户以外的用户是没有写入权限的,但是通过ACL配置了oliva用户对该文件有写权限,那么oliva用户对该文件是有写权限的。

在使用“ls -l”或“ll”命令浏览文件或目录时,在权限部分多了一个“+”表示该文件或目录已经配置了ACL功能。

        [root@srv tmp]# ll
        total 8
        drwxrwxr-x+ 2 root root 4096 Feb 15 23:25 house

1.配置分区支持ACL功能

在RHEL 5.x中只有在安装操作系统时建立的分区才支持ACL功能,其他分区在默认情况下是不支持ACL功能。如果希望让那些在安装操作系统完成后建立的分区支持ACL功能可以使用以下几种方法。

(1)使用tune2fs命令。tune2fs功能非常多,但这里重点说明与ACL有关的功能。使用tune2fs命令让一个分区永久支持ACL功能,该命令配置分区支持ACL的语法如下。

        tune2fs -o acl分区

在下面的例子中使用tune2fs命令使/dev/sda12永久支持ACL功能,在配置完成后,可通过“tune2fs-l分区”命令查看。

● 使/dev/sda12永久支持ACL功能。

        [root@srv ~]# tune2fs -o acl /dev/sda12

● 使用-l选项可查看分区的配置情况。

        [root@srv ~]# tune2fs -l /dev/sda12
        tune2fs 1.39 (29-May-2006)
        Filesystem volume name:   <none>
        Last mounted on:         <not available>
        Filesystem UUID:         8c54398d-e4c8-4777-9d09-26eed1041049
        Filesystem magic number:  0xEF53
        Filesystem revision #:   1 (dynamic)
        Filesystem features:     has_journal resize_inode dir_index filetype sparse_super
        #在“Default mount options:”的值中包括“acl”就说明该分区支持ACL功能。
        Default mount options:    acl
        Filesystem state:        clean
        Errors behavior:         Continue
        Filesystem OS type:      Linux

(2)使用mount命令。mount命令主要用于进行磁盘挂载的操作,该命令功能非常多,但这里重点说明与ACL有关的功能,该命令其他功能见第7章。使用mount命令让一个分区临时支持ACL功能(在重新启动计算机后ACL会失效),该命令配置分区支持ACL的语法如下。

        mount -o remount,acl分区
        mount -o acl分区 挂载点

使用mount命令让一个分区临时支持ACL功能时,可以使用以上两种方式。第一种使用在分区已经被挂载的情况,也就是说这个分区已经在使用但还不支持ACL功能,在不影响分区使用的情况下重新挂载分区使其支持ACL功能;第二种使用在一开始挂载分区时就使其支持ACL功能。在下面的例子中使用mount命令使分区临时支持ACL功能,在配置完成后,可通过“mount”命令查看。

● 使用mount命令使一个已经挂载的分区(/dev/sda13)支持ACL功能。

        [root@srv ~]# mount -o remount /dev/sda13

● 使用mount命令挂载/dev/sda14分区并支持ACL功能。

        [root@srv ~]# mount -o acl /dev/sda14 /media/sda14
        [root@srv ~]# mount   #使用mount命令查看。
        /dev/sda7 on / type ext3 (rw)
        proc on /proc type proc (rw)
        sysfs on /sys type sysfs (rw)
        devpts on /dev/pts type devpts (rw,gid=5,mode=620)
        /dev/sda8 on /tmp type ext3 (rw)
        /dev/sda6 on /var type ext3 (rw)
        /dev/sda3 on /home type ext3 (rw)
        /dev/sda2 on /usr type ext3 (rw)
        /dev/sda5 on /usr/local type ext3 (rw)
        /dev/sda1 on /boot type ext3 (rw)
        tmpfs on /dev/shm type tmpfs (rw)
        /dev/sda10 on /media/sda10 type ext3 (rw)
        /dev/sda11 on /media/sda11 type ext3 (rw,acl)
        none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
        none on /proc/fs/vmblock/mountPoint type vmblock (rw)
        sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
        #如果分区支持ACL功能时,在挂载信息中会显示出来。
        /dev/sda13 on /media/sda13 type ext3 (rw,acl)
        /dev/sda14 on /media/sda14 type ext3 (rw,acl)

(3)修改/etc/fstab文件,使分区永久支持ACL功能。在/etc/fstab文件中在需要支持ACL功能分区的挂载选项列中加上“,acl”即可使分区永久支持ACL功能。在下面/etc/fstab文件的例子中/dev/sda10就支持ACL功能。在修改/etc/fstab文件后,为了让配置生效需要重新启动计算机或使用“mount-o remount分区”命令。

    [root@srv ~]# cat /etc/fstab
    LABEL=/              /                ext3          defaults         1 1
    LABEL=/tmp           /tmp             ext3          defaults         1 2
    LABEL=/var           /var             ext3          defaults         1 2
    LABEL=/home          /home            ext3          defaults         1 2
    LABEL=/usr           /usr             ext3          defaults         1 2
    LABEL=/usr/local     /usr/local       ext3          defaults         1 2
    LABEL=/boot          /boot            ext3          defaults         1 2
    tmpfs                /dev/shm         tmpfs         defaults         0 0
    devpts               /dev/pts         devpts        gid=5,mode=620   0 0
    sysfs                /sys             sysfs         defaults         0 0
    proc                 /proc            proc          defaults         0 0
    LABEL=SWAP-sda9      swap             swap          defaults         0 0
    /dev/sda10          /media/sda10    ext3          defaults,acl       0 0

提示

通过tune2fs命令使分区支持ACL功能后,通过mount命令是无法查看到的,通过修改/etc/fstab使分区支持ACL功能后,通过mount命令可以查看到分区支持ACL功能。

2.setfacl:配置文件或目录的ACL

在配置了分区支持ACL功能后,就可以使用setfacl命令让文件或目录使用ACL功能配置更精细的权限。在Linux中对文件或目录的权限是可读、可写入、可执行,ACL功能可对不同的用户配置这些权限,该命令语法如下。

        setfacl [-bkdR] [{-m|-x} <ACL规则>] 文件|目录...

常用指数:

常用选项:

● 文件|目录...:需要配置ACL的文件或目录。

● -m:更改文件或目录的ACL规则。

● -x:删除文件或目录指定的ACL规则。

● -b:删除文件或目录所有ACL规则。

● -k:删除文件或目录默认的ACL规则。

● -d:指定文件或目录默认的ACL规则。

● --test:测试模式,不会改变任何文件或目录的ACL规则,操作后的ACL规格将被显示。

● -R:递归处理,将指定目录下的所有文件及子目录一并处理。

在该命令中指定ACL规则可以使用以下几种方式。

(1)[d:]u:<UID|用户>:权限:指定用户的ACL,[d:]表示配置用户对文件或目录的默认的ACL,权限可以使用字符或数字。

(2)[d:]g:<GID|用户组>:权限:指定用户的ACL,[d:]表示配置用户对文件或目录的默认的ACL,权限可以使用字符或数字。

(3)[d:]o:权限:相关于普通权限中其他用户的权限,[d:]表示配置用户对文件或目录的默认的ACL,权限可以使用字符或数字。

(4)[d:]m:权限:指定有效权限,[d:]表示配置的默认的权限,权限可以使用字符或数字。

在文件或目录配置了ACL后,如果使用cp命令复制时要保留ACL必须使用“-p”选项,如果使用mv命令移动时默认就会保留ACL。当然前提是目标目录所有分区支持ACL功能。下面看几个setfacl命令的例子。

(1)配置用户ACL。

● 目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。

        [root@srv ~]# cd /tmp

● 当前目录目前情况。

        [root@srv tmp]# ll
        total 8
        drwxr-xr-x 2 root root 4096 Feb 16 17:15 fringe
        drwxr-xr-x 2 root root 4096 Feb 16 17:14 house

● 配置用户charles对目录fringe有可读、可写权限。

        [root@srv tmp]# setfacl -m u:charles:rw fringe/

● 配置用户charles对目录house有可读、可写、可执行权限。

        [root@srv tmp]# setfacl -m u:charles:7 house/

● 浏览目录时,在权限最后一位是一个“+”表示这两个目录配置了ACL。

        [root@srv tmp]# ll
        total 16
        drwxrwxr-x+ 2 root root 4096 Feb 16 17:15 fringe
        drwxrwxr-x+ 2 root root 4096 Feb 16 17:14 house

● 切换到用户charles。

        [root@srv tmp]# su - charles
        [charles@srv ~]$ cd /tmp/house/

● 在目录house有写权限了。

        [charles@srv house]$ touch Cameron

(2)配置用户默认ACL。

● 目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。

        [root@srv ~]# cd /tmp

● 当前目录目前情况。

        [root@srv tmp]# ll
        total 4
        drwxr-xrwx 2 root root 4096 Feb 16 19:53 house

● 配置用户cameron对目录house的默认ACL有可读、可写、可执行权限,当用户cameron在目录house中建立子目录或文件时,会自动继承这个ACL。

        [root@srv tmp]# setfacl -m d:u:cameron:rwx house/

● 浏览目录在权限最后一位是一个“+”表示这两个目录配置了ACL。

        [root@srv tmp]# ll
        total 8
        drwxr-xrwx+ 2 root root 4096 Feb 16 19:53 house

● 切换到用户cameron。

        [root@srv tmp]# su - Cameron
        [cameron@srv ~]$ cd /tmp/house/
        [cameron@srv house]$ mkdir season6

● 建立的子目录自动继承了ACL。

        [cameron@srv house]$ ll
        total 8
        drwxrwxrwx+ 2 cameron cameron 4096 Feb 16 20:03 season6

(3)配置用户组ACL。

● 目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。

        [root@srv ~]# cd /tmp

● 当前目录目前情况。

        [root@srv tmp]# ll
        total 8
        drwxr-xr-x 2 root root 4096 Feb 16 17:24 24
        drwxr-xr-x 2 root root 4096 Feb 16 17:24 csi

● 配置用户组ctu对目录24有可读、可写、可执行权限。

        [root@srv tmp]# setfacl -m g:ctu:rwx 24

● 配置用户组ctu对目录csi没有任何权限。

        [root@srv tmp]# setfacl -m g:ctu:--- csi

● 浏览目录时,在权限最后一位是一个“+”表示这两个目录配置了ACL。

        [root@srv tmp]# ll
        total 16
        drwxrwxr-x+ 2 root root 4096 Feb 16 17:24 24
        drwxr-xr-x+ 2 root root 4096 Feb 16 17:24 csi

● 切换到用户jack。

        [root@srv tmp]# su - jack
        [jack@srv ~]$ id

● 用户jack属于用户组ctu。

        uid=509(jack) gid=509(jack) groups=503(user3),504(user4),509(jack),513(ctu)

● 对目录没有执行权限,所以用户jack无法进入目录csi。

        [jack@srv ~]$ cd /tmp/csi
        -bash: cd: /tmp/csi: Permission denied

(4)配置用户组默认ACL。

● 目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。

        [root@srv ~]# cd /tmp

● 当前目录目前情况。

        [root@srv tmp]# ll
        total 4
        drwxr-xrwx 2 root root 4096 Feb 16 20:12 24

● 配置用户组ctu对目录24的默认ACL有可执行权限,当属于用户组ctu的用户在目录24中建立子目录或文件时,会自动继承这个ACL。

        [root@srv tmp]# setfacl -m d:g:ctu:x 24

● 浏览目录时,在权限最后一位是一个“+”表示这两个目录配置了ACL。

        [root@srv tmp]# ll
        total 8
        drwxr-xrwx+ 2 root root 4096 Feb 16 20:12 24

● 切换到用户jack。

        [root@srv tmp]# su - jack

● 用户jack属于用户组ctu。

        [jack@srv ~]$ id
        uid=509(jack) gid=509(jack) groups=503(user3),504(user4),509(jack),513(ctu)
        [jack@srv ~]$ cd /tmp/24
        [jack@srv 24]$ mkdir season8

● 建立的子目录自动继承了ACL。

        [jack@srv 24]$ ll
        total 8
        drwxr-xr-x+ 2 jack jack 4096 Feb 16 20:15 season8

(5)删除指定ACL。

● 目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。

        [root@srv ~]# cd /tmp

● 使用getfacl命令查看house目录的ACL,可以发现用户cameron对该目录有可读、可写、可执行权限。

        [root@srv tmp]# getfacl house
        # file: house
        # owner: root
        # group: root
        user::rwx
        user:jack:---
        user:cameron:rwx
        group::r-x
        mask::rwx
        other::r-x

● 取消用户cameron在目录house上的ACL。

        [root@srv tmp]# setfacl -x u:cameron house

● 再次查看目录house的ACL时,已经没有用户cameron。

        [root@srv tmp]# getfacl house/
        # file: house
        # owner: root
        # group: root
        user::rwx
        user:jack:---
        group::r-x
        mask::r-x
        other::r-x

(6)删除所有ACL。

● 目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。

        [root@srv ~]# cd /tmp

● 使用getfacl命令查看house目录的ACL,可以发现用户cameron对该目录有可读、可写、可执行权限;用户jack对该目录没有任何权限。

        [root@srv tmp]# getfacl house
        # file: house
        # owner: root
        # group: root
        user::rwx
        user:jack:---
        user:cameron:rwx
        group::r-x
        mask::rwx
        other::r-x

● 删除目录house上的所有权限。

        [root@srv tmp]# setfacl -b house

● 再次查看目录house的ACL时,已经没有任何ACL。

        [root@srv tmp]# getfacl house/
        # file: house
        # owner: root
        # group: root
        user::rwx
        group::r-x
        other::r-x

(7)配置ACL有效权限。

● 目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。

        [root@srv ~]# cd /tmp

● 用户jack对目录24的权限是可读、可写、可执行。

        [root@srv tmp]# getfacl 24
        # file: 24
        # owner: root
        # group: root
        user::rwx
        user:jack:rwx
        group::r-x
        mask::rwx
        other::r-x

● 切换到用户jack后,可进入目录24,也可以浏览和写入。

        [root@srv tmp]# su - jack
        [jack@srv ~]$ cd /tmp/24
        [jack@srv 24]$ mkdir Season8
        [jack@srv 24]$ ll
        total 4
        drwxrwxr-x 2 jack jack 4096 Feb 16 20:30 Season8

● 回到root用户。

        [jack@srv 24]$ exit

● 指定目录24有效权限为可读、可执行。

        [root@srv tmp]# setfacl -m m:rx 24

● 切换到用户jack后,可进入目录24,也可以浏览。

        [root@srv tmp]# su - jack
        [jack@srv ~]$ cd /tmp/24
        [jack@srv 24]$ ll
        total 4
        drwxrwxr-x 2 jack jack 4096 Feb 16 20:30 Season8

● 但是已经没有了写入权限。

        [jack@srv 24]$ mkdir Season7
        mkdir: cannot create directory `Season7': Permission denied

明明配置了用户jack的ACL中有写入权限,为什么这里没有权限写了呢?这是因为目录24上配置的有效ACL为可读、可权限,Linux会将有效权限于用户或用户组的ACL中进行“AND”运行,也就是说只有在有效ACL中有的权限用户或用户组才可能得到。目录24的有效权限是可读、可执行,所以对该目录配置ACL时,最多可以得到这两个权限。即使jack有写入权限也是没有意义的。

3.getfacl:查看文件或目录的ACL

通过“ls -l”或“ll”命令浏览文件或目录时,只能知道文件或目录是否已配置了ACL功能,但具体配置的内容必须使用getfacl命令查看,该命令语法如下。

        getfacl [-dR] [--omit-header] [--no-effective] 文件|目录...

常用指数:

常用选项:

● 文件|目录...:需要显示ACL的文件或目录。

● -d:显示默认的ACL。

● -R:显示目录及其子目录和文件的ACL。

● --omit-header:不显示文件或目录的基本信息。

● --no-effective:不显示有效权限。

getfacl命令可以显示配置了ACL的文件或目录的准确权限,下面看几个getfacl命令的例子。

● 目录fringe权限部分以“+”结尾,说明该目录配置了ACL。

        [root@srv tmp]# ll
        total 15
        drwxr-xr-x+ 2 root root  1024 Feb 16 15:05 fringe
        drwx------  2 root root 12288 Feb 16 12:47 lost+found
        drwxr-xr-x  2 root root  1024 Feb 16 15:09 weeds

● 显示目录fringe的默认权限。

        [root@srv tmp]# getfacl fringe/
        # file: fringe                    #文件或目录的名称。
        # owner: root                     #文件或目录的所有者。
        # group: root                     #文件或目录的拥有组。
        user::rwx                         #文件或目录的所有者权限。

● 用户charles的权限,后面的“#effective”显示的是该用户有效权限。root用户为charles配置的该目录权限是rwx,但由于该目录的有效权限是rx,所以最后该用户实际的权限只有rx。

        user:charles:rwx                 #effective:r-x
        group::r-x                        #文件或目录的拥有组权限。
        mask::r-x                         #文件或目录的最大权限。
        other::r-x                        #其他用户权限。

提示

在为文件和目录配置了ACL功能后,通过“ls -l”或“ll”命令浏览文件或目录时,拥有组权限位显示的不再是该文件或目录拥有组权限,而是ACL的最大权限,所以要查看文件的准确权限应该使用getfacl命令。