版权声明:自我梳理及总结的内容,如果您需要转载请注明出处,非常感谢! https://blog.csdn.net/Smasegain/article/details/48261429
一.说明
二.setfacl语法说明我们都知道Linux中可以通过chmod来维护文件的权限,但是文件的权限设置很有局限性。比如:小张有辆车(小张是属主,可以rwx),小张的老婆,爸妈都可以r-x(小张的老婆,爸妈和小张是属于同一个group),其他人只有r--的权限。但是小张又不能不给老婆面子,车也要给老丈人有r-x的权限,通过chmod就没有办法实现了(此处就认定他的老丈人为other)。所以Linux中又有一个Access Control List来维护一些非常规权限。
setfacl用于设置文件的扩展权限(This utility sets Access Control Lists (ACLs) of files and directories.),同样也可以设置基本权限(设置基本权限不及chmod方便)。主要语法及参数说明如下:
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m, --modify=acl 修改文件当前的ACL(s),ACL中 必须包含权限,多个ACL可以以逗号(',')隔开;-M, --modify-file=file 修改文件的ACL,ACL配置来源于配置文件或管道输入(每行最多一个ACL,#开头的整行为注释, 来源于标准输入的ACL用减号'-'表示);-x, --remove=acl 删除文件的ACL记录,ACL条目仅不包含权限字段(必须包含uid/gid, 不能移除基本权限);-X, --remove-file=file 删除文件的ACL,ACL配置来源于配置文件或管道输入(备注同-M)-b, --remove-all 删除所有的 扩展ACL,基本的ACL条目(例如755)不会被移除-k, --remove-default 删除默认的ACL--set=acl 按照acl指定的值完全重设ACL, 原配置会被覆盖;--set-file=file 从文件读取ACL并重新设置文件的ACL--mask 结合MASK重新计算实际生效的ACL( 仅针对owner和other以外的用户有效)-n, --no-mask 不重新结合MASK值进行计算有效权限-d, --default 操作默认ACL( 仅文件夹可用,普通文件不能没有默认ACLs)-R, --recursive 递归修改所有子文件、文件夹的ACL-L, --logical logical walk, follow symbolic links(如果被查看对象时link则显示源文件的ACL)-P, --physical physical walk, do not follow symbolic links(如果被查看对象是link则不显示ACL)--restore=file restore ACLs (inverse of `getfacl -R')--test test mode (ACLs are not modified)-v, --version print version and exit-h, --help this help text-- End of command line options. All remaining parameters are interpreted as file names, even if they start with a dash.
ACL条目设置方式(实际记录无需输入空格,perms字段可以是rwx的组合,也可以是一个数字):
[d[efault]:] [u[ser]:]uid [:perms]指定特定用户(用户名和UID均可)的权限,如果uid空置则默认为文件属主[d[efault]:] g[roup]:gid [:perms]指定特定组(组名和GID均可)的权限,如果Gid空置则默认为文件属组[d[efault]:] m[ask][:] [:perms]有效权限的MASK[d[efault]:] o[ther][:] [:perms]other用户的权限
注意事项:
1).基础的ACL记录不能通过-x参数移除,即属主权限、属组权限,其他用户权限;2).如果指定特定用户/组的ACL,则必须设置mask值,如果不设置将会把group的权限设置为UMASK;3).设置默认ACL时owner,group,other三个基本ACL必须存在,如果不存在系统会自动添加;4).为文件针对某个用户设置默认ACL时未设置mask,则会添加同默认ACL组的权限一直的MASK
三.getfacl语法说明
getfacl(get file access control lists),对于文件夹和文件,getfacl命令会显示出文件名,属主,属组,访问权限列表(ACLs)。对于文件夹还会显示default ACLs,普通文件是不能设置default ACLs的。getfacl输出内容及详细说明如下:
1: # file: somedir/ -->文件名
2: # owner: lisa -->文件属主
3: # group: staff -->文件属组x: # flags:--t -->特殊权限:suid,sgid,stick bit
4: user::rwx -->属主权限(外加属主权限,other权限一起统称为base permission,可以通过chmod修改也可以通过setfacl修改)
5: user:joe:rwx #effective:r-x -->特定用户权限,受mask影响实际权限为r-x6: group::rwx #effective:r-x -->属组权限,受umask影响实际为r-x
7: group:cool:r-x -->指定组权限
8: mask:r-x -->mask设置,影响除了ower和other外的所有用户/组的权限
9: other:r-x10: default:user::rwx -->直到14行为文件夹默认ACLs, 普通文件无此项
11: default:user:joe:rwx #effective:r-x
12: default:group::r-x
13: default:mask:r-x
14: default:other:---
语法说明:
getfacl [-dRLPvh] file ...
--accesss:仅输出访问权限列表,不输出defaul ACLs;-d:仅输出default ACLs;--omit-header:不输出以#开始的行;--skip-base:跳过仅包含base ACLs的文件;-R:递归查看子文件/文件夹的ACLs;--tabular:使用tabular格式显示:--:参数结束符,后续所有的一破折号开头的值都不被看做参数;-:如果文件名为破折号,则getfacl从标准输入读取文件名;
四.范例演示
1.sefacl修改chmod可修改的权限(个人认为还是chmod用起来更简单):
[root@node110 ~]# umask0022
[root@node110 ~]# touch copy.sh
[root@node110 ~]# getfacl copy.sh
# file: copy.sh
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@node110 ~]# setfacl -m u::1,g::2,o::3 copy.sh-->( 等效于chmod 0123 copy.sh)
[root@node110 ~]# getfacl copy.sh
# file: copy.sh
# owner: root
# group: root
user::--x
group::-w-
other::-wx
2.默认ACL设置:
[root@node110 ~]# getfacl van/
# file: van
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[root@node110 ~]# setfacl -m d:u:oracle:5 van/
[root@node110 ~]# getfacl van/
# file: van
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:oracle:r-x( 此记录为添加项,其他默认ACL为系统参照base ACL自动添加,mask参照默认group权限添加)
default:group::r-x
default:mask::r-x
default:other::r-x[root@node110 ~]# setfacl -m d:u:oracle:7 copy.sh
setfacl: copy.sh: Only directories can have default ACLs( 普通文件无法添加默认ACL)
3.移除van文件夹的默认ACL及其他ACL(base ACLs除外):
[root@node110 ~]# getfacl van/
# file: van/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:oracle:r-x
default:group::r-x
default:mask::r-x
default:other::r-x
[root@node110 ~]# setfacl -k van/(仅移除default ACLs)
[root@node110 ~]# getfacl van/
# file: van/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[root@node110 ~]# setfacl -m u:oracle:7 van/
[root@node110 ~]# setfacl -m d:u:oracle:7 van/
[root@node110 ~]# getfacl van/
# file: van/
# owner: root
# group: root
user::rwx
user:oracle:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:oracle:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@node110 ~]# setfacl -b van/(移除base ACLs以外的所有ACLs)
[root@node110 ~]# getfacl van/
# file: van/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x