在这次的河北省中职比赛中碰到了一些关于linux下facl的题目,以前没有注意过,现在碰到了,就重新总结windows和linux下的文件权限。也解决了我对linux下权限的疑惑。

       windows的权限分为了两种文件权限和文件夹权限,权限分别为“完全控制,读取,写入,修改、读取和执行、列出文件夹权限、特殊权限”,文件权限中没有列出文件夹权限。可以对用户和组分别授权,比较灵活,在域中还延伸出了AGGDLP,AGDLP等策略。此处就不在赘述。

      linux下的权限只有所属的用户,用户所属组,其他用户,这3种类别用户的权限,而且每种中也只有读写执行这3种权限,功能简单粗暴,根本就比拟不了windows中一个可以对不同用户进行不同授权,让我感觉linux下的文件权限是个短板,应该学习windows啊。看到Facl后,才知道不是linux下文件权限不能更灵活的授权,而是咱见识少,没有扎实的学习linux基础。不过我在使用FACL后还是发现不如windows的权限设置方便和灵活。

      下面我们来看一下FACL:

       Linux 开发出了一套新的文件系统权限管理方法,叫文件访问控制表 (Access Control Lists, ACL)。简单地来说,ACL 就是可以设置特定用户或者用户组对于一个文件的操作权限。 ACL 有两种,一种是存取 ACL (access ACLs),针对文件和目录设置访问控制列表。一种是默认 ACL (default ACLs),只能针对目录设置。如果目录中的文件没有设置 ACL,它就会使用该目录的默认 ACL。其中getfacl和setfacl是linux下设置facl的主要命令。

      getfacl:取得某个文件/目录的ACL设置项目。
      setfacl:设置某个目录/文件的ACL规定。

     1.setfacl的参数(从网上搜索得来,懒得翻了):   

利用命令setfacl --help查看帮助文件

Usage:setfacl[-bkndRLP]{-m|-M|-x|-X...}file... # 
-m|-M|-x|-X

-m,--modify=acl modify the current ACL(s)of file(s) 
#设置文件acl规则

-M,--modify-file=file readACL entries tomodify from file 
#修改文件acl规则

-x,--remove=acl remove entries from the ACL(s)of file(s) 
#删除文件的acl规则

-X,--remove-file=file readACL entries toremove from file 
#删除文件的acl规则

-b,--remove-all remove all extended ACL entries # 
删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留。-k,--remove-default remove the defaultACL 
#删除缺省的acl规则。如果没有缺省规则,将不提示.

--set=acl set the ACL of file(s),replacing the current ACL.

--set-file=file readACL entries toset from file     #从文件中读设置ACL规则.

--mask dorecalculate the effective rights mask    #重新计算有效权限,即使ACLmask被明确指定。

-n,--no-mask don'trecalculate the effective rights mask 
#不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。

-d,--default operations apply tothe defaultACL 
#设定默认的acl规则,针对目录而言.

-R,--recursive recurse into subdirectories 
#递归的对所有文件及目录进行操作.

-L,--logical logical walk,follow symbolic links 
#跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。

-P,--physical physical walk,donotfollow symbolic links 
#跳过所有符号链接,包括符号链接文件。

--restore=file restore ACLs(inverse of`getfacl-R') 
#从文件恢复备份的acl规则(这些文件可由getfacl-R产生)。通过这种机制可以恢复整个目录树的acl规则。此参数不能和除--test以外的任何参数一同执行.

--test testmode(ACLs are notmodified) 
#测试模式,不会改变任何文件的acl规则,操作后的acl规格将被列出.

-v,--version print version andexit #版本.

-h,--help thishelp text #不用说肯定是帮助了.


当使用-M,-X选项从文件中读取规则时,setfacl接受getfacl命令输出

的格式。每行至少一条规则,以#开始的行将被视为注释.

2.setfacl具体应用

setfacl –m u:用户名:权限 文件名。 例如:setfacl -m user:qiao:rw /var/qiao   

setfacl –m g:组名:权限 文件名。    例如:setfacl -m group:qiao:rwx /var/qiao

要设定缺省ACL只需在每个规则前加上"default:" 。 例如: 

setfacl -m default:user::rw /var/qiao           或简写为:setfacl -m d:u::rw /var/qiao

setfacl -x qiao /var/qiao       解除用户qiao对文件的acl权限 

setfacl -x g:qiao /var/qiao       解除组qiao对文件的acl权限 

setfacl -b /var/qiao       删除所有扩展的acl规则 

setfacl -m m::r-x a        收回所有用户和所有组的写的权限 

setfacl -m d:u:wl:rwx,g:wl:rwx b (其中d表示defaults) 让子目录下的文件和文件夹继承权限

getfacl abc |setfacl —set-file=- xyz    这是个很有意思的命令,它可以让一个文件的权限直接复制改成那一个文件的权限,例如复制文件abc权限到xyz。

setfacl -m m::rwx        设置mask的话,这个命令可不针对文件所属的用户和组,但其他用户和组权限要和mask权限“与”,也就是应用mask和其他用户最严苛的权限,另外如果设定mask值之后,再添加了针对新用户的权限,mask值有可能改变,也就是说如果像利用mask值来控制用户权限,它必须最后设置。

 

3.getfacl的应用

getfacl qiao 
# file: qiao
# owner: test
# group: test
user::rw-
user:wang:rw-
group::rw-
mask::rw-
other::r--