首页 > 代码库 > facl

facl

     在linux系统中,由于权限的问题,在权限不匹配的情况下,是不能操作(这里所说的操作包括读、写、删除)其他用户的文件的。

     在用户以及用户的属组  与  文件的属主、属组不匹配的情况下,用户只能以‘其他用户’的身份访问该文件,而文件的创建者为了安全在创建此文件时并不想让‘其他用户’操作此文件,但是又想让某一个用户(该用户属于‘其他用户’)访问。

     在这种情况下,如果有root的话,可以把两个用户放到同一个用户组中。但是在没有root的情况下,该如何解决?这时就可让文件的创建者修改文件的访问控制列表acl。把‘其他用户’添加到此文件的属主并赋予权限、或添加到属组并赋予权限。这样添加的这个‘其他用户’就可操作此文件了。

    查看文件acl的命令:

        getfacl  file1  file2.....

   查看的结果格式类似如下:

[john@localhost test]$ getfacl test
# file: test
# owner: john
# group: john
user::rw-
group::rw-
other::r--

    添加acl的命令格式:

        setfacl -m  user:UserName:Perms  file1 ...

        setfacl -m  group:GroupName:Perms  file1 ...

    添加acl权限后,在使用ll命令查看文件时,在权限位上会出现一个 + 号,则证明此文件有acl权限。下面添加一个其他用户具有读写权限。

[john@localhost test]$ id
uid=501(john) gid=501(john) groups=501(john) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[john@localhost test]$ ll
total 0
-rw-rw-r--. 1 john john 0 Sep  1 20:35 test
[john@localhost test]$ setfacl -m user:bob:rw- test
[john@localhost test]$ ll
total 4
-rw-rw-r--+ 1 john john 0 Sep  1 20:35 test

    先使用id命令可看到当前用户是john,接下来用ll命令查看当前目录下的文件,然后给当前目录下的test文件添加一个acl让bob用户对此文件具有rw(读写)权限,再用ll命令可看到test文件的权限位上已经多出一个 + 号。

[bob@localhost test]$ id
uid=502(bob) gid=502(bob) groups=502(bob) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[bob@localhost test]$ ll
total 8
-rw-rw-r--+ 1 john john 10 Sep  1 20:59 test
[bob@localhost test]$ cat test
hello bob
[bob@localhost test]$ echo "hello john" >> test
[bob@localhost test]$ cat test
hello bob
hello john
[bob@localhost test]$

    切换到bob用户,使用cat命令读取test文件内容,可看到能正常读取出来;再使用echo命令向test文件中写入数据,写入后再cat一下可看到刚才已经写入的内容。

    此次试验中没有把test文件的‘其他用户’权限位上的读权限去掉,这个再次做试验时可以把这个权限去掉,这样可以更好的说明在‘其他用户’没有任何权限的情况下,acl所起的作用。

    

    取消acl权限的命令:

        setfacl  -x  user:UserName:  file1 ...

        setfacl  -x  group:GroupName:  file1 ...

    在取消的命令中UserName后面不加冒号(:)也可以,并且后面不用跟权限,如果跟权限会报错

[john@localhost test]$ id
uid=501(john) gid=501(john) groups=501(john) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[john@localhost test]$ ll
total 8
-rw-rw----+ 1 john john 21 Sep  1 20:59 test
[john@localhost test]$ setfacl -x user:bob: test
[john@localhost test]$ cat test
hello bob
hello john
[john@localhost test]$

在上述命令中john用户把test的acl权限取消。然后在下面的命令中用bob用户对其进行读操作,可见bob已经不能进行读取test文件中的内容。

[bob@localhost test]$ id
uid=502(bob) gid=502(bob) groups=502(bob) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[bob@localhost test]$ ll
total 8
-rw-rw----+ 1 john john 21 Sep  1 20:59 test
[bob@localhost test]$ cat test
cat: test: Permission denied
[bob@localhost test]$

在上面命令中可能你会发现,在john用户已经把acl取消掉,并且bob用户确实对test文件没有操作权限了,test的权限位上仍存在 + 号,可使用getfacl test查看一下。

[bob@localhost test]$ getfacl test
# file: test
# owner: john
# group: john
user::rw-
group::rw-
mask::rw-
other::---

可看到多了个mask::rw-权限,把此权限取消后 + 号就会消失,这个权限是添加acl权限自动添加上去的。

[john@localhost test]$ setfacl -x mask:: test
[john@localhost test]$ ll
total 4
-rw-rw----. 1 john john 21 Sep  1 20:59 test

至于mask是什么权限,这里简单说下,mask会伴随着添加了user或group的acl权限而产生,通常会和添加的user或group的acl权限位保持一致,比如添加user的acl权限为rw,随之出现的mask的权限也为rw。

    若是文件原来属组的权限为rw-,在设置user或group的acl权限为rwx的情况下,这时属组的权限就会显示为rwx,实际文件的属组用户并没有执行权限(x),所以在碰到权限中带有 + 号的文件,查看文件属组权限时要使用getfacl file命令查看。

[john@localhost test]$ ll
total 4
-rw-rw----. 1 john john 21 Sep  1 20:59 test
[john@localhost test]$ setfacl -m user:bob:rwx test
[john@localhost test]$ ll
total 8
-rw-rwx---+ 1 john john 21 Sep  1 20:59 test
[john@localhost test]$



参考http://man.linuxde.net/setfacl

本文出自 “甘木” 博客,请务必保留此出处http://ganmu.blog.51cto.com/9305511/1845998

facl