ACL是Access Control List的缩写,可以针对单一用户、单一文件或目录进行r、w、x权限的设置。

举个例子,你就会很快明白ACL的用途:

 假如现在的有一个开发团队,这个团队有3个人:user1、user2、user3,他们在同一个目录(/project)下工作(即附加组),而且每一个开发人员都有自己的主文件夹和基本的私有组。
 他们可以修改其他人的权限(这里可以使用SGID),但是他们的头头(user)可以对此项目目录中的任何数据进行查看,就是不能修改。
 此时就需要用到ACL了!
 
下面来详细介绍ACL吧!

1、如何查看文件系统是否支持ACL,并让我们的文件系统支持ACL:

(1)使用mount命令直接查看挂载参数,以/dev/sda1为例,没有看到acl:

(2)使用dumpe2fs命令可以看到RHEL5默认是支持acl的:

 

(3)可以使用下面的操作来支持acl:

(4)要想永久有效,可以修改文件/etc/fstab,添加如下行:

 

2、 设置ACL:
 文件系统支持ACL后,设置ACL可以由2个命令就可以搞定了!
 命令:
  getfacl:查看某个文件/目录的ACL设置
  setfacl:设置某个文件/目录的ACL
 下面来详细介绍两个命令的使用方法:
 (1)命令getfacl的用法:
           getfacl file ...

 
  1. [root@linli acl_test]# cp /var/log/messages ./  
  2. [root@linli acl_test]# ll  
  3. total 84  
  4. -rw------- 1 root root 76547 Jul  5 13:30 messages  
  5. [root@linli acl_test]# getfacl messages   
  6. # file: messages  
  7. # owner: root  
  8. # group: root  
  9. user::rw-  
  10. group::---  
  11. other::--- 

 (2)命令setfacl的用法:
           setfacl  [{-m|-x} acl_spec]  file ...
           -m:表示设置某个文件/目录的ACL
                对于用户acl_specl的设置方法是:
                     u:[用户账号列表]:[rwx]

 
  1. [root@linli acl_test]# setfacl -m u:magedu:rw messages   
  2. [root@linli acl_test]# getfacl messages   
  3. # file: messages  
  4. # owner: root  
  5. # group: root  
  6. user::rw-  
  7. user:magedu:rw-  // 可以看到magedu这个用户对messages具有rw权限
  8. group::---  
  9. mask::rw-  
  10. other::--- 

                对于组acl_specl的设置方法是:
                     g:[组列表]:[rwx]

 
  1. [root@linli acl_test]# setfacl -m g:redhat:rx messages   
  2. [root@linli acl_test]# getfacl messages  
  3. # file: messages  
  4. # owner: root  
  5. # group: root  
  6. user::rw-  
  7. user:magedu:rw-  
  8. group::---  
  9. group:redhat:r-x  
  10. mask::rwx  
  11. other::--- 

                对于mask的设置方法是:
                     m:[rwx]

 
  1. [root@linli acl_test]# setfacl -m m:r messages   
  2. [root@linli acl_test]# getfacl messages   
  3. # file: messages  
  4. # owner: root  
  5. # group: root  
  6. user::rw-  
  7. user:magedu:rw-         #effective:r--  //可以看到实际生效的只有r权限
  8. group::---  
  9. group:redhat:r-x        #effective:r--  //可以看到实际生效的只有r权限
  10. mask::r--  //mask定义的权限与给某个用户或组定义的权限的交集是实际生效的权限
  11. other::--- 

                     注意: 这主要用于规定最大允许权限,就能够避免不小心开放某些权限给其他用户或组了。

                对于默认权限的acl_specl的设置方法是:
                     d:[ug]:用户账号列表:[rwx]

 
  1. [root@linli ~]# setfacl -m d:u:student:rwx /acl_test/  
  2. [root@linli ~]# getfacl /acl_test/  
  3. # file: acl_test  
  4. # owner: root  
  5. # group: root  
  6. user::rwx  
  7. group::r-x  
  8. other::r-x  
  9. default:user::rwx  
  10. default:user:student:rwx  
  11. default:group::r-x  
  12. default:mask::rwx  
  13. default:other::r-x  
  14. //新建一个文件test测试一下,是否可以继承权限  
  15. [root@linli acl_test]# touch test  
  16. [root@linli acl_test]# ll test  
  17. -rw-rw-r--+ 1 root root 0 Jul  5 13:42 test  
  18. [root@linli acl_test]# getfacl test //可以看到已经生效  
  19. # file: test  
  20. # owner: root  
  21. # group: root  
  22. user::rw-  
  23. user:student:rwx        #effective:rw-  
  24. group::r-x      #effective:r--  
  25. mask::rw-  
  26. other::r-- 

                      注意:这主要是为让ACL的权限设置能够被子目录继承。

    
        -x:表示取消某个文件/目录的ACL
             对于用户acl_specl的设置方法是:
                  u:[用户账号列表]

 
  1. [root@linli acl_test]# setfacl -x u:student test  
  2. [root@linli acl_test]# getfacl test   
  3. # file: test  
  4. # owner: root  
  5. # group: root  
  6. user::rw-  
  7. group::r-x  
  8. mask::r-x  
  9. other::r-- 

            对于组acl_specl的设置方法是:
                  g:[组列表]

 
  1. [root@linli acl_test]# setfacl -x g:redhat messages   
  2. [root@linli acl_test]# getfacl messages   
  3. # file: messages  
  4. # owner: root  
  5. # group: root  
  6. user::rw-  
  7. user:magedu:rw-  
  8. group::---  
  9. mask::rw-  
  10. other::--- 

        -b:删除所有的ACL设置

             setfacl -b file

 
  1. [root@linli acl_test]# setfacl -m g:redhat:rx messages   
  2. [root@linli acl_test]# getfacl messages   
  3. # file: messages  
  4. # owner: root  
  5. # group: root  
  6. user::rw-  
  7. user:magedu:rw-  
  8. group::---  
  9. group:redhat:r-x  
  10. mask::rwx  
  11. other::---  
  12.  
  13. [root@linli acl_test]# setfacl -b messages   
  14. [root@linli acl_test]# getfacl messages   
  15. # file: messages  
  16. # owner: root  
  17. # group: root  
  18. user::rw-  
  19. group::---  
  20. other::---