Linux 文件权限 ACL 权限 详解

什么是 ACL 权限 ?

        场景带入

                #     某大牛在QQ群内直播讲解Linux系统的权限管理,讲解完之后,他在Linux系统中创

                        建了一个  /project 目录,里面存放的是课后参考资料。那么 /project 目录对于大牛

                        而言是所有者(那自然是了,人家创建的啊)拥有读写可执行(rwx)权限。

                     

                #      对于 QQ群内的所有用户他们都被 大牛 分配在一个所属组里面,也都拥有读写可执

                        行(rwx)权限。 QQ 群里的所有用户 就相当于来上 大牛老师的课的学生 。

                       

                #     而对于 QQ 群外的其他人,那么我们不给他访问/project 目录的任何权限,

                       你们这些 QQ 群外的人 肯定不能有权限啊,你们都不是 大牛老师的学生,当然不能

                       有对 资料的权限了!!

               #     综上 : / project 目录的所有者和所属组权限都是(rwx),其他人自然没有权限!!

               

                当你理解了上述场景后,问题来了 :

                现在呢,由于 大牛老师讲的太好了,就会有不少学生想要 听课,就是想来试听试听,当

                个旁听生,那么对于这些旁听生我们应该怎么理解呢 ?

                ===>>> 

                                 首先,这些旁听生 肯定先不是 QQ 群内的学生,就是 不是 大牛老师的学生,

                                 不然就不叫 旁听了,那也就是说 是属于  其他人 的那一项, 而 旁听生前来听

                                 课肯定也得需要学习资料 ( 也就是说需要对资料的权限  : r-x ) 

                                 你个旁听生 当然不能 有 w 权限了( 你不能对老师的学习资料 改来改去呀 )

                ===>>>  

                                 那我们说  旁听生 是势必属于 其他人的那一项的,那也就意味着 旁听生肯定

                                 是和 其他人的权限是一样的,但是 其他人的权限是 ----  是没有权限啊!!!

                                 而现在我们却想要  旁听生 拥有 r-x 的权限!!!

                                 这不就是 冲突 !!

                                 意味着我们要给 旁听生 分配 r-x 权限  并且 除了 旁听生的其他人权限是 无!

                                 

                                

                                 

                                  那么,为了解决这一冲突,我们就得开始 引入  ACL 权限了!!!

    ACL 权限 :  

                   官方  : 我们给指定的用户指定目录分配指定的权限,也就是 ACL 权限分配

    模拟场景  : 

           #      模拟学习资料 

[root@bogon ~]# mkdir /project
[root@bogon /]# ls -ld project
drwxr-xr-x. 2 root root 6 Nov  6 16:44 project
[root@bogon ~]# chmod 770 /project
[root@bogon ~]# ls -ld /project
drwxrwx---. 2 root root 6 Nov  6 16:44 /project
[root@bogon ~]# chown rhcsa:rhcsa /project
[root@bogon ~]# ls -ld /project
drwxrwx---. 2 rhcsa rhcsa 6 Nov  6 16:44 /project

                      / project  就相当于 学习资料 

                      我们创建了 学习资料 , 并且 修改了权限为 770 ( 让其他用户的权限为 0 )

                      暂时把 所属主和所属组 切换为 rhcsa : rhcsa (   暂时的) 

         #     模拟 人员  

[root@bogon ~]# useradd teacher
[root@bogon ~]# groupadd csagroup


[root@bogon ~]# useradd zhangsan
[root@bogon ~]# useradd lisi


[root@bogon ~]# useradd pangting

                  teacher  :          大牛 ( 老师 )

                  zhangsan , lisi  :   课堂里的学生( 也是 QQ 群里的学生  )   

                  csagroup  :     QQ 群   --  组 

                  pangting  :    旁听生  

           模拟 实际关系

[root@bogon ~]# chown teacher:csagroup /project
[root@bogon ~]# ls -ld /project
drwxrwx---. 2 teacher csagroup 6 Nov  6 16:44 /project


[root@bogon ~]# gpasswd -a zhangsan csagroup
Adding user zhangsan to group csagroup
[root@bogon ~]# gpasswd -a lisi csagroup
Adding user lisi to group csagroup

              刚才不是说了  rhcsa : rhcsa ( 只是暂时的 ,暂时也没啥用,就只是不想看见root 罢了)

              现在 对于 /project 的所属主 和 所属组 正式为 teacher 和  csagroup  

              把 学生 zhangsan  lisi  加入到 csagroup 里 !

       #   测验下场景

[root@bogon ~]# su - pangting
[pangting@bogon ~]$ cd /project
-bash: cd: /project: Permission denied

               我们不是有个 旁听生嘛,现在让他看看能不能进入到我们的学习资料里去!!

               ===>>>

                                在没有进行 ACL 之前 显然是不能的 !! 

                                没有权限访问 !!

               至此,这个模拟场景就是彻底实现了!! 

               然后就是 关于我们的正题 -----   ACL 对于上述场景 的应用了 !!!

设置 ACL 权限  :

              查看 ACL 权限  : 

              ===>>>      getfacl   文件名            

       展示出来的 就是  ACL 权限  !!! 

      待会儿操作的时候 就可以看到 其效果( 现在这个是 我们什么还没操作呢 ,可以作为对比) 

              设置 ACL  权限  :

               ===>>>        setfacl   文件名  

               选项  :

-m:设定 ACL 权限。
    
    如果是给予用户 ACL 权限,则使用 "u:用户名:权限"  格式赋予;
    如果是给予组 ACL 权限,则使用   "g:组名:权限"    格式赋予;

-x: 删除指定的 ACL 权限;

-b: 删除所有的 ACL 权限;

-d: 设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限;

-k: 删除默认 ACL 权限;

-R: 递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效

                                

             场景实操 : 

[root@bogon project]# setfacl -m u:pangting:r-x /project

              上示 即是 我们使用  setfacl 命令 来对  旁听生  进行 ACL 权限操作 !

               #    使用了 - m 选项     用户名 :  pangting   设置的 权限是 r-x  

                     这一操作就完完全全解决了  我们前面 举例的  场景问题 !!!!

                     这就是  ACL 权限的作用  !!!!

               #   注意如下所示,如果某个目录或文件下有 + 标志,说明其具有 acl 权限。

               我们刚才设定了 ACL 权限,现在再 查看下 ACL 权限 看看有哪些变化 :

               那查看 ACL 权限 是要用 什么命令呢 ??

               ===>>>    自然是 gatfacl  

             现在看上示内容,再和之前的 gatfacl 做对比 ,就明显可以看到 当我们设置了 针对用户的

             ACL 权限后 就会 在  user 那一栏 里 多了 pangting  用户 和其所对应的 权限 r-x 

            #  我们在使用  pangting 用户 验证一下  :

[root@bogon project]# su - pangting
[pangting@bogon ~]$ cd /project
[pangting@bogon project]$ 

                   显然,当给  pangting 用户 设置了 ACL 权限分配 r-x 后 那么 pangting 用户即可以访问

                   到  / project  目录 !

             来试下 - x   选项 :  删除指定的权限  

[root@bogon project]# setfacl -x u:pangting /project
[root@bogon project]# su - pangting
[pangting@bogon ~]$ cd /project
-bash: cd: /project: Permission denied

                   那么这个时候,当 删除掉了 pangting 的 ACL 权限分配 后,此时就明显可以看到 

                   pangting  用户已经无法再对  / project 访问了 !!!

          #    来看下  -b   选项  :   删除所有的 ACL 权限 !!

                  我们再把刚才删除的 pangting 用户重新设置  ACL 权限 ;

                  我们再创建一个 新用户 pangting2  并且给它 设置 好 ACL 权限 ;

[root@bogon ~]# setfacl -m u:pangting:r-x /project 


[root@bogon ~]# useradd pangting2
[root@bogon ~]# setfacl -m u:pangting2:r-x /project

                   查看下 ACL 权限 :

[root@bogon ~]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: teacher
# group: csagroup
user::rwx
user:pangting:r-x
user:pangting2:r-x
group::rwx
mask::rwx
other::---

               - b  选项 :       

[root@bogon ~]# setfacl -b /project

                   删除所有 就不需要指定了,直接删除 目录 / project  就行 

               查看 ACL 权限 :

[root@bogon ~]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: teacher
# group: csagroup
user::rwx
group::rwx
other::---

        #   -d选项  设定默认 ACL 权限

                              只对目录生效,指目录中新建立的文件拥有此默认权限。

                              就是说如果对 目录设定了 默认权限,那也就意味着 这个目录中的 文件 也就拥

                              有了此默认权限 !!

                        

               我们先看看没有对目录设定默认权限之前,目录 和 其下的文件的权限是什么样子?

               ===>>>

                                在目录 / project 里创建文件 

[root@bogon ~]# cd /project
[root@bogon project]# touch file1

 

                                 查看  / project 的权限 :

                ===>>>

              

                               再查看 file 1 的 文件权限 :

                 ===>>>  

                

              通过对比 : 

              ===>>  

                               目录 和 文件 的所属主 所属主 不一样; 权限也不一样 !!!

            那现在,我们就用下 这个  -d  选项 ,就会使得 目录里新建的文件也会拥有此默认权限 

            那怎么设置默认权限呢 ??

            ===>>>

                      setfacl   -d   -m u: xxx( 用户名)  xxx(一般权限)    目录名 (文件)

            ===>>>

           

             可以看到,设置默认权限成功后,使用 getfacl 查看的时候,下面就出现了 default !!

            然后,我们再在该目录下再新建一个文件,再查看下它的 ACL 权限 :

           

           直接可以看到的是,当目录设置了默认权限后,该目录再新建文件的时候,该文件会自动就

           和目录的权限保持一致!!

           并且 你可以看到的是 出现了    #   effective   !!

            由此,我们再 引出   #   effective 

            #   effective    :  这个指的是 有效权限 !!!

             那它咋来的呢 ??

            ===>>>

                               是根据 mask 来的!!    在上示结果中 :  mask 是  rw-  

                              effective  :   是和 mask  与    过之后的权限 !!

             

               以上示 : mask 是 rw-     也即是  110 

                               又由于  user  权限是 101  

                               所以其有效权限是  110( mask ) &  101 ( user )  ==  100 

                               所以,user  那一行的有效权限为 100  就是    r-- 

                               同理,又由于 group 权限为 rwx 也就是 111 

                               所以其有效权限为 : 110(mask) &  111 ( group )  ==  110 

                                所以 ,group 那一行的有效权限就是 110  即 rw- 

      #  -k 选项   :  删除默认权限 

                          

             我们删除了 默认权限后,再查看其权限,可以看到 已经没有 default 了 !!

            我们再在目录下创个文件 ,来看看这个文件还有没有 # effective 有效权限 !

           

              显然,再在 目录下创建新文件,已经没有了 有效权限!!!

     mask  :   最大有效权限 

                怎么设置 mask 的权限呢 ?

                ===>>>

setfacl -m m:权限 文件名

                 示例  :

[root@bogon project]# setfacl -m m:rwx file2

                 上示我们把 mask 的权限就设置成了 rwx 也就是  111  

                    :

                                需要清楚的是,当你把 mask 设置成 rwx 的时候也就是 111 的时候,那就意味

                                着 该文件不会再出现    #  effective  有限权限 !!

                                因为  任何权限和 mask ( 当被设置为 111 ) 都会是本身 !

                                所以不会显示    # effective   

                        

      拓展

                        我可以根据一个文件的 ACL 信息去设置 另一个文件的 ACL 信息 

                       ===>>>

                                       使用 getfacl 的输出 作为 setfacl 的输入 ( 管道符 )     

getfacl file-A | setacl --set-file=- file-B

                

                        示例  :

                                       这是 file1 的 ACL 信息 

[root@bogon project]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--

                                        这是 file2 的ACL 信息 


[root@bogon project]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
user:pangting:r-x		#effective:r--
group::rwx			#effective:rw-
mask::rw-
other::---

                              现在我们使用 命令 使得 file1 可以变为 file2 的ACL 信息 

              ===>>>

[root@bogon project]# getfacl file2 | setfacl --set-file=- file1

                                 然后查看 file1 的ACL 信息有没有变化 

               ===>>>

[root@bogon project]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:pangting:r-x		#effective:r--
group::rwx			#effective:rw-
mask::rw-
other::---

                                显然,此时的 file 1 的 ACL 全新变的 和 file2 的一模一样了 !!!!                      

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值