简 介:setfacl与getfacl是一对对应的命令.而且都有acl,ACL 有两种,一种是存取 ACL (access ACLs),针对文件和目录设置访问控制列表。一种是默认 ACL (default ACLs),只能针对目录设置。如果目录中的文件没有设置 ACL,它就会使用该目录的默认 ACL,传统的 Linux 文件系统的权限控制是通过 user、group、other 与 r(读)、w(写)、x(执行) 的不同组合来实现的。
参 数:
[test1@localhost ~]$ setfacl -h setfacl 2.2.49 -- set file access control lists Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ... -m, --modify=acl modify the current ACL(s) of file(s)#更改文件的访问控制列表 -M, --modify-file=file read ACL entries to modify from file#从文件读取访问控制列表条目更改 -x, --remove=acl remove entries from the ACL(s) of file(s)#根据文件中访问控制列表移除条目 -X, --remove-file=file read ACL entries to remove from file#从文件读取访问控制列表条目并删除 -b, --remove-all remove all extended ACL entries #删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留 -k, --remove-default remove the default ACL #删除缺省的acl规则。 --set=acl set the ACL of file(s), replacing the current ACL#设定替换当前的文件访问控制列表 --set-file=file read ACL entries to set from file#从文件中读取访问控制列表条目设定 --mask do recalculate the effective rights mask#重新计算有效权限掩码 -n, --no-mask don't recalculate the effective rights mask #不要重新计算有效权限。setfacl默认会重新计算acl mask,除非mask被明确的制定 -d, --default operations apply to the default ACL#设定默认的acl规则 -R, --recursive recurse into subdirectories#递归的对所有文件及目录进行操作 -L, --logical logical walk, follow symbolic links#跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录 -P, --physical physical walk, do not follow symbolic links#跳过所有符号链接,包括符号链接文件 --restore=file restore ACLs (inverse of `getfacl -R')#从文件恢复备份的acl规则(这些文件可由getfacl -R产生)。通过这种机制可以恢复整个目录树的acl规则。此参数不能和除--test以外的任何参数一同执行 --test test mode (ACLs are not modified)#测试模式,不会改变任何文件的acl规则,操作后acl规则将被列出 -v, --version print version and exit#输出setfacl的版本号并退出 -h, --help this help text#输出帮助信息。 [test1@localhost ~]$ #选项-m和-x后面跟acl规则。多条acl规则以逗号(,)隔开。选项-M和-X用来从文件或标准输入读取acl规则。 #选项--set和--set-file用来设置文件或目录的acl规则,先前的设定将被覆盖。 #选项-m(--modify和-M(--modify-file)选项修改文件或目录的acl规则。 #选项-x(--remove)和-C(--remove-file)选项删除acl规则。 #当使用-M,-X选项从文件中读取规则时,setfacl接受getfacl命令输出的格式。 #当在不支持acls的文件系统上使用setfacl命令时,setfacl将修改文件权限位。如果acl规则并不完全匹配文件权限位,setfacl将会修改文件权限位使其尽可能的反应acl规则,并会向standard error发送错误消息,以大于0的状态返回。
说 明:对用户设置权限
[test1@localhost ~]$ setfacl -m u:username:rw- test.txt //普通的文件 [test1@localhost ~]$ setfacl -m d:u:username:rw- test/ //对目录设置
对组设置权限
[test1@localhost ~]$ setfacl -m g:group:r-- test.txt [test1@localhost ~]$ setfacl -m d:g:group:r-- test/
查看权限
[test1@localhost ~]$ getfacl filename/directory //文件或目录名
注 意:设置的文件或目录是刚刚新挂载的,它会提示“Operation not supported”,原因是新挂载的硬盘默认没有acl权限!
手动添加ACL权限
[test1@localhost ~]$ vim /etc/fstab UUID="****************" /mnt/data ext4 defaults,acl 0 0 /dev/sda1 /mnt/data2 ext4 defaults,acl 0 0 #挂载的时候,尽量都UUID方式,因为这样挂载起来比较安全,具体的uuid可以使用命令来查看 [test1@localhost ~]$ blkid /dev/sda2: UUID="0e478849-816a-4d0f-b554-62341a611e80" TYPE="ext4"
实 例:
添加权限
#用户test创建一个目录dir一个文件fil [test@localhost ~]$ mkdir dir [test@localhost ~]$ touch fil #修改fil权限使其他用户不可以访问 [test@localhost ~]$ chmod 750 fil [test@localhost ~]$ ll total 4 drwxrwxr-x 2 test test 4096 Jul 26 14:14 dir -rwxr-x--- 1 test test 0 Jul 26 14:14 fil #切换到用户test1验证权限 [test@localhost ~]$ su - test1 Password: [test1@localhost ~]$ cd /home/test/d -bash: cd: /home/test/d: Permission denied #没有给test1进入/home/test权限 [test1@localhost ~]$ su - test Password: [test@localhost ~]$ getfacl /home/test getfacl: Removing leading '/' from absolute path names # file: home/test # owner: test # group: test user::rwx group::--- other::--- default:user::rwx default:user:test1:rwx default:group::--- default:mask::rwx default:other::--- #给其他用户访问test目录权限 [test@localhost ~]$ chmod 755 /home/test [test@localhost ~]$ getfacl /home/test getfacl: Removing leading '/' from absolute path names # file: home/test # owner: test # group: test user::rwx group::r-x other::r-x default:user::rwx default:user:test1:rwx default:group::--- default:mask::rwx default:other::--- [test@localhost ~]$ su - test1 Password: #创建好的目录其他用户是没有写权限 [test1@localhost ~]$ cd /home/test/dir [test1@localhost dir]$ touch fil1 touch: cannot touch `fil1': Permission denied #提示test1对dir没有写权限 [test1@localhost ~]$ cat /home/test/fil cat: /home/test/fil: Permission denied #提示test1对fil无访问权限 [test1@localhost ~]$ su - test Password: #修改test1对fil有访问权限,对dir有完全权限 [test@localhost ~]$ setfacl -m u:test1:r fil ;setfacl -m u:test1:4 fil [test@localhost ~]$ setfacl -m u:test1:rwx dir ;setfacl -m u:test1:7 dir [test@localhost ~]$ su - test1 Password: [test1@localhost ~]$ touch /home/test/dir/file3 #test1对dir有写权限了 [test1@localhost ~]$ cat /home/test/fil #test1可以访问fil了 #test1 test2都属于file dir的other组,通过test2依然无法访问fil 和dir的写操作 [root@localhost ~]# su - test2 [test2@localhost ~]$ cat /home/test/fil cat: /home/test/fil: Permission denied [test2@localhost ~]$ touch /home/test/dir/file4 touch: cannot touch `/home/test/dir/file4': Permission denied [test2@localhost ~]$
删除权限
[test@localhost ~]$ getfacl /home/test/fil getfacl: Removing leading '/' from absolute path names # file: home/test/fil # owner: test # group: test user::rwx user:test1:r-- group::r-x mask::r-x other::--- [test@localhost ~]$ setfacl -x u:test1: /home/test/fil [test@localhost ~]$ getfacl !$ getfacl /home/test/fil getfacl: Removing leading '/' from absolute path names # file: home/test/fil # owner: test # group: test user::rwx group::r-x mask::r-x other::--- [test@localhost ~]$ su - test1 Password: [test1@localhost ~]$ cat /home/test/fil cat: /home/test/fil: Permission denied [test@localhost ~]$ getfacl /home/test/dir/ getfacl: Removing leading '/' from absolute path names # file: home/test/dir/ # owner: test # group: test user::rwx user:test1:rwx group::rwx mask::rwx other::r-x default:user::rwx default:user:test:rwx default:user:test1:rwx default:group::rwx default:mask::rwx default:other::r-x [test@localhost ~]$ setfacl -x u:test1 /home/test/dir/ [test@localhost ~]$ getfacl /home/test/dir/ getfacl: Removing leading '/' from absolute path names # file: home/test/dir/ # owner: test # group: test user::rwx group::rwx mask::rwx other::r-x default:user::rwx default:user:test:rwx default:user:test1:rwx default:group::rwx default:mask::rwx default:other::r-x [test1@localhost ~]$ touch /home/test/dir/file6 touch: cannot touch `/home/test/dir/file6': Permission denied