首页 > 代码库 > 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