Ubuntu Kylin技术论坛

 找回密码
查看: 3312|回复: 2

umask与文件mask

[复制链接]
  • TA的每日心情
    奋斗
    2018-8-22 10:21
  • 签到天数: 80 天

    [LV.6]常住居民II

    发表于 2015-4-15 21:24:01 | 显示全部楼层 |阅读模式
    今天在研究ACL功能时发现以前对umask与文件mask的理解有问题。

    通过实验发现,原来umask命令是用来设置文件、目录的常用9个权限问题,这个权限位我们可以直接通过ls命令查看,例如:
    1. ls -l /tmp/test
    2. -rw-rw-r-- 1 ukylin ukylin 0  4月 15 19:55 /tmp/test
    3. ls -dl /tmp/dir
    4. drwxrwxr-x 1 ukylin ukylin 0  4月 15 19:58 /tmp/dir
    复制代码

    当我在/tmp目录下,执行umask命令设置为0077时,分别创建文件test1和目录dir1,并到dir1目录下再创建test2文件,结果如下:
    1. cd /tmp
    2. umask 0077
    3. touch test1
    4. mkdir dir1
    5. touch dir1/test2
    6. ls -l test1
    7. -rw------- 1 ukylin ukylin    0  4月 15 20:02 test1
    8. ls -dl dir1
    9. drwx------ 2 ukylin ukylin 4096  4月 15 20:02 dir1
    10. ls -l dir1/test2
    11. -rw------- 1 ukylin ukylin 0  4月 15 20:03 dir1/test2
    复制代码

    为什么在没有执行umask时,在/tmp目录下创建的文件test为0664,目录dir为0775呢?
    这是因为,系统中设定了默认创建的文件是没有执行权限的即最大为0666,而目录权限为0777,
    但是对于系统中的用户而言均设置了默认的umask值,对与普通用户而言是0002,而root是0022,可采用如下命令查看
    1. $ umask
    2. 0002
    3. $ sudo -i
    4. # umask
    5. 0022
    复制代码

    同时umask指定的是默认值是需要减掉的权限,因此对于test文件而言就是0666-0002=0664;而dir目录就是0777-0002=0775了;
    当用户在某终端执行了umask命令设置后,则该终端会将umask默认值给替换为新设置的值,例如上面执行的将0002替换为了0077;
    于是test1文件的权限就变成了0666-0077=0600;而dir1则是0777-0077=0700;同样由于test2文件也是在该终端创建的,所以权限为0600;
    (注:如果重新启动一个终端,在/tmp目录下创建文件,其权限和test一致为0664,因为umask值的设定是与具体的设置终端相关,另启终端则umask值为默认的0002了)

    当我对/tmp/test文件执行如下操作时,问题就来了:
    1、采用ukylin用户创建的/tmp/test文件,通过ssh切换到test1用户读/tmp/test文件,可读(这个是0664的4号权限"r")
    1. echo "Hello1" > /tmp/test
    2. ssh test1@localhost
    3. cat /tmp/test
    4. Hello1
    复制代码
    2、采用如下方式通过ukylin为/tmp/test文件设置mask掩码,不让用户读/tmp/test文件(即设置为---,没有任何权限)
    1. setfacl -m m::--- /tmp/test
    2. getfacl /tmp/test
    3. # file: tmp/test
    4. # owner: ukylin
    5. # group: ukylin
    6. user::rw-
    7. group::rw-                        #effective:---
    8. mask::---
    9. other::r--
    复制代码
    3、然后采用test1对/tmp/test文件执行如下操作,依然可以读!但是不能写!由此可见当other有"r"权限时,及时mask为---,test1用户还是有读权限的
    1. cat /tmp/test
    2. Hello1
    3. echo "Hello2" >> /tmp/test
    4. -bash: /tmp/test: 权限不够
    复制代码
    4、接下来通过ukylin执行如下动作
    1. setfacl -m u:test1:-w- /tmp/test
    2. getfacl /tmp/test
    3. # file: test
    4. # owner: ukylin
    5. # group: ukylin
    6. user::rw-
    7. user:test1:-w-
    8. group::rw-
    9. mask::rw-
    10. other::r--
    复制代码
    5、然后切换到test1用户对/tmp/test文件执行如下操作
    1. cat /tmp/test
    2. cat: /tmp/test: 权限不够
    3. echo "Hello2" >> /tmp/test
    复制代码
    采用ukylin用户查看/tmp/test文件时,发现test1用户写入成功,由此可见对于ACL列表而言,其优先级要高于9个权限位,因为即使other有"r"权限,但是user:test1:-w-没有读
    1. cat /tmp/test
    2. Hello1
    3. Hello2
    复制代码
    6、再一次采用ukylin设置mask值
    1. setfacl -m m::--- /tmp/test
    2. getfacl /tmp/test
    3. # file: test
    4. # owner: ukylin
    5. # group: ukylin
    6. user::rw-
    7. user:test1:-w-                 #effective:---
    8. group::rw-                           #effective:---
    9. mask::---
    10. other::r--
    复制代码
    然后,让test1用户执行如下操作,发现mask设置后,ACL里的w权限给去除了,但是r权限怎么就又有了呢?难道是other的"r"在作怪
    1. cat /tmp/test
    2. Hello1
    3. Hello2
    4. echo "Hello3" >> /tmp/test
    5. -bash: /tmp/test: 权限不够
    复制代码
    于是,我又继续采用ukylin执行如下操作
    1. chmod 0660 /tmp/test
    2. getfacl /tmp/test
    3. # file: test
    4. # owner: ukylin
    5. # group: ukylin
    6. user::rw-
    7. user:test1:-w-
    8. group::rw-
    9. mask::rw-
    10. other::---
    复制代码
    接着采用test1用户先后执行读、写,发现不能“读”,但是可以“写”,即ACL列表生效,此时mask值被取消了没有“#effective:---”,并且继承了group的权限
    然后再次用ukylin执行掩码设置操作
    1. setfacl -m m::--- test
    2. getfacl test
    3. # file: test
    4. # owner: ukylin
    5. # group: ukylin
    6. user::rw-
    7. user:test1:-w-   #effective:---
    8. group::rw-                          #effective:---
    9. mask::---
    10. other::---
    复制代码
    采用test1用户验证是否设置成功,此时,读、写均没有权限。

    通过上面的对比测试,我发现,文件的掩码其实是只针对ACL中的user和group中的权限,当设置了掩码,但是other有其他权限时,则other中的权限不会影响
    当对权限进行再次设置时,掩码mask值会恢复为默认值“rw-”

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-8-22 10:21
  • 签到天数: 80 天

    [LV.6]常住居民II

     楼主| 发表于 2015-4-16 11:35:23 | 显示全部楼层
    此外,通过setfacl命令分别设置ACL的user和group时,当user中设置的用户属于group中的组时,其权限以user中设置的具体用户权限为主,group权限会被屏蔽,但对user中未设置的group组的用户有效。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2016-1-17 18:18
  • 签到天数: 181 天

    [LV.7]常住居民III

    发表于 2015-4-17 21:49:47 来自手机 | 显示全部楼层
    学习了,原来是这样
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|Ubuntu Kylin    

    GMT+8, 2019-6-16 23:36 , Processed in 0.016935 second(s), 10 queries , File On.

    Copyright ©2013-2019 Ubuntu Kylin. All Rights Reserved .

    ICP No. 15002470-2 Tianjin

    快速回复 返回顶部 返回列表