简 介: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