Linux文件权限管理看这篇就够了

  • 原创
  • Madman
  • /
  • 2018-04-01 09:07
  • /
  • 0
  • 438 次阅读

Linux文件权限管理看这篇就够了-min.png

Synopsis: 如果你设置好文件权限后,却经常遇到Permission denied,说明你的权限设置有问题,判断是否有文件相应的操作权限,首先要判断是否拥有此文件的上层目录的相应操作权限。本文详细介绍了为什么rx权限对目录文件很重要,创建普通文件和目录文件时的预设权限是什么,有时候你用root账号也无法删除一个文件,可能是此文件设置了隐藏权限,如果有团队项目文件共享的需求你可能要用到SUID/SGID/SBIT,配置Samba或FTP服务器时还会经常使用访问权限控制ACL,所有这些文件权限管理你都可以轻松掌握,只需要静下心来仔细阅读这篇文章并动手做实验即可!

1. 权限管理

1.1 目录文件的权限管理

如果只是让所有人可以目录下的文件列表,建议只赋予rx权限

(1) 目录只有x权限

能够用cd命令将目录切换为当前工作目录current working directory。不能够用ls -l命令查看目录的内容(即目录下的文件列表),因为这需要目录r权限。但是如果你知道这个目录下确实存在某个文件,可以查看这个文件信息的。

1. 首先用root用户创建测试用的目录和文件
# umask
0022
# mkdir dir1
# echo "Hello Linux" > dir1/file1
# chmod 751 dir1/
# ls -ld dir1/
drwxr-x--x 2 root root 19 Apr 11 09:56 dir1/
# ls -l dir1/
total 4
-rw-r--r-- 1 root root 12 Apr 11 09:56 file1

2. 然后用普通用户alice测试
$ ls -l dir1/
ls: cannot open directory dir1/: Permission denied
$ cd dir1/
$ ls -l
ls: cannot open directory .: Permission denied

$ ls -l file1
-rw-r--r-- 1 root root 12 Apr 11 09:56 file1

(2) 目录只有w权限

啥都干不了

$ ls -ld dir1/
drwxr-x-w- 2 root root 19 Apr 11 09:56 dir1/
$ ls -l dir1/
ls: cannot open directory dir1/: Permission denied
$ cd dir1/
-bash: cd: dir1/: Permission denied
$ ls -l dir1/file1
ls: cannot access dir1/file1: Permission denied

$ touch dir1/a
touch: cannot touch ‘dir1/a’: Permission denied
$ mv dir1/file1 dir1/file1.bak
mv: failed to access ‘dir1/file1.bak’: Permission denied
$ rm -f dir1/file1
rm: cannot remove ‘dir1/file1’: Permission denied
$ cp /etc/passwd dir1/
cp: cannot stat ‘dir1/passwd’: Permission denied

(3) 目录有w+x权限

除了拥有x功能外,还能够创建文件、重命名文件、删除文件、将文件复制或移动到本目录下

$ ls -ld dir1/
drwxr-x-wx 2 root root 19 Apr 11 10:47 dir1/
$ ls -l dir1/
ls: cannot open directory dir1/: Permission denied
$ cd dir1/
$ ls -l
ls: cannot open directory .: Permission denied
$ ls -l file1
-rw-r--r-- 1 root root 12 Apr 11 10:47 file1

$ touch a
$ mv a a1
$ rm a1
$ cp /etc/passwd .

(4) 目录只有r权限

能够用ls -l命令查看目录的内容(即目录下的文件列表),但是文件的权限、属主等信息显示为问号(因为这需要目录x权限)

$ ls -ld dir1/
drwxr-xr-- 2 root root 19 Apr 11 09:56 dir1/
$ ls -l dir1/
ls: cannot access dir1/file1: Permission denied
total 0
-????????? ? ? ? ?            ? file1
$ cd dir1/
-bash: cd: dir1/: Permission denied
$ ls -l dir1/file1
ls: cannot access dir1/file1: Permission denied

(5) 目录有r+x权限

能够正常查看该目录下有哪些文件了,但是不能够创建文件、重命名文件、删除文件、将文件复制或移动到本目录下

$ ls -ld dir1/
drwxr-xr-x 2 root root 19 Apr 11 09:56 dir1/
$ ls -l dir1/
total 4
-rw-r--r-- 1 root root 17 Apr 11 10:12 file1
$ cd dir1/
$ ls -l
total 4
-rw-r--r-- 1 root root 17 Apr 11 10:12 file1

$ touch test
touch: cannot touch ‘test’: Permission denied
$ rm -f file1 
rm: cannot remove ‘file1’: Permission denied
$ mv file1 file1.bak
mv: cannot move ‘file1’ to ‘file1.bak’: Permission denied
$ cp /etc/passwd .
cp: cannot create regular file ‘./passwd’: Permission denied

(6) 目录有r+w权限

能够用ls -l命令查看目录的内容(即目录下的文件列表),但是文件的权限、属主等信息显示为问号(因为这需要目录x权限)。由于没有x权限,当然不能够在目录下创建文件、重命名文件、删除文件、将文件复制或移动到本目录下

$ ls -ld dir1/
drwxr-xrw- 2 root root 19 Apr 11 10:50 dir1/
$ ls -l dir1/
ls: cannot access dir1/file1: Permission denied
total 0
-????????? ? ? ? ?            ? file1
$ cd dir1/
-bash: cd: dir1/: Permission denied
$ ls -l dir1/file1 
ls: cannot access dir1/file1: Permission denied

$ touch dir1/a
touch: cannot touch ‘dir1/a’: Permission denied
$ mv dir1/file1 dir1/file1.bak
mv: failed to access ‘dir1/file1.bak’: Permission denied
$ rm -f dir1/file1
rm: cannot remove ‘dir1/file1’: Permission denied
$ cp /etc/passwd dir1/
cp: cannot stat ‘dir1/passwd’: Permission denied

(7) 目录有rwx全部权限

能够查看文件列表、创建文件、重命名文件、删除文件、将文件复制或移动到本目录下

$ ls -ld dir1/
drwxr-xrwx 2 root root 33 Apr 11 10:27 dir1/
$ cd dir1/
$ echo "This a test file" > test.txt
$ cat test.txt 
This a test file
$ mv test.txt test.txt.bak
$ rm test.txt.bak 
$ cp /etc/passwd .
$ ls -l
total 8
-rw-r--r-- 1 root  root    17 Apr 11 10:12 file1
-rw-r--r-- 1 alice alice 1588 Apr 11 10:27 passwd

注意:

如果目录有rwx全部权限,就算它下面的文件权限为空,用vim打开时,是空的文本内容(因为没有r权限),此时输入一些内容,然后用:wq!强制保存退出,发现覆盖了原文件内容,且属主和属组也改变了!

# ls -ld dir1/
drwxr-xrwx 2 root root 6 Apr 11 11:31 dir1/
# echo "Hello Linux" > dir1/file1
# cat dir1/file1 
Hello Linux
# chmod 600 dir1/file1
# ls -l dir1/file1
-rw------- 1 root root 12 Apr 11 11:32 file1

$ ls -l dir1/
total 4
-rw------- 1 root root 12 Apr 11 11:32 file1
$ ls -l dir1/file1 
-rw------- 1 root root 12 Apr 11 11:32 dir1/file1
$ cat dir1/file1 
cat: dir1/file1: Permission denied
$ echo -e "\nI love linux" >> dir1/file1 
-bash: dir1/file1: Permission denied

$ vim dir1/file1  使用:wq!强制保存退出

# cat dir1/file1 
What happened?
# ls -l dir1/file1 
-rw------- 1 alice alice 15 Apr 11 11:34 dir1/file1

1.2 一般文件的权限管理

操作 dir1/ dir1/file1 dir2/ 说明
查看file1文件的权限、属主等详细信息 至少x 要能进入dir1目录
读取file1的文本内容 至少x,建议r+x r 1. 要能进入dir1目录; 2. file1要有读取权限
修改file1的文本内容 至少x,建议r+x 至少w,建议r+w 1. 要能进入dir1目录; 2. file1至少要有w权限,此时不能用vim编辑,因为没有r权限,只能用重定向>覆盖内容或>>追加内容。grep/sed/awk这些都不能用,因为全都要读取文件内容。
执行file1文件 至少x,建议r+x 至少r+x 1. 要能进入dir1目录; 2. file1至少要有r+x权限,程序要执行需要把代码复制到内存中
删除file1文件 至少w+x,建议rwx 需要能够修改dir1目录,参考"目录文件的权限管理"中第3条
将file1复制到dir2/ 至少x,建议r+x r 至少w+x,建议rwx 1. 要能读取file1的文本内容(cp的原理),参考本表格第2行; 2. 要能够修改目标位置dir2目录(cp的原理),参考本表格第5行
将file1移动到dir2/ 至少w+x,建议rwx 至少w+x,建议rwx 要能够同时修改起始位置和目标位置目录(mv的原理),参考本表格第5行

2. 文件预设权限 umask

wiki

不知道你有没有注意到,root用户新建目录文件或其它一般文件时,它们的权限是多少呢?普通用户新建文件时的权限又是多少呢?这些都与umask有关,umask是用来更改当前用户在新建目录文件或其它一般文件时的权限预设值,具体来说,umask值只是一个掩码,它从创建文件时的默认权限中掩去对应位置的权限。

2.1 默认权限

目录文件和一般文件的默认权限是不一样的,由本文第一节我们知道x权限对目录来说是非常重要的,但是一般文件的建立则不应该有可执行权限(通常用于记录内容,而不是运行程序)

  • 用户创建目录文件,由于x与是否可以进入此目录有关,因此默认开放所有权限,即777(rwxrwxrwx)
  • 用户创建一般文件,则默认取消可执行权限,即666(rw-rw-rw-)

2.2 umask

(1) 查看默认的umask

1. root用户
# umask
0022
# umask -S
u=rwx,g=rx,o=rx  符号表示法,表示属组和其它人都要掩去w权限

2. 普通用户
$ umask
0002

umask的第1位表示要掩去的特殊权限(见本文第4节),第2位表示要掩去属主的权限,第3位表示要掩去属组的权限,第4位表示要掩去其它人的权限

(2) 如何计算

创建文件时的最终预设权限计算方法是,先将umask和默认权限转换为二进制, 然后对umask二进制取反运算(NOT),再将其与目录或文件的二进制做与运算(AND),得到的二进制再转换为八进制值。

更为简便的符号计算法,先将umask转换为符号表示法,再将默认权限的符号,减去umask对应位置的符号即可。假如umask为0022,新建目录文件权限为755,新建一般文件为644:

1. 新建目录文件,(drwxrwxrwx) - (d----w--w-) = (drwxr-xr-x)
# umask
0022
# mkdir testdir
# ls -l
drwxr-xr-x  2 root root      6 May 15 10:57 testdir

2. 新建一般文件,(-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--)
# touch testfile
# ls -l
-rw-r--r--  1 root root      0 May 15 10:55 testfile

但是,千万不能使用八进制表示的数字直接相减,结果可能是错误的。比如,umask为0003,表示要掩去其它人的wx权限,如果用八进制直接相减,则新建文件权限为0666-0003=0663(-rw-rw--wx),与设置umask的目的不符合,下面演示它为什么是错误的:

1. 将umask和默认权限转换为二进制
003 -> 000 000 011
777 -> 111 111 111
666 -> 110 110 110

2. umask的二进制取反NOT
000 000 011 -> 111 111 100

3. 步骤2的值与步骤1的值做与运算AND
111 111 100 AND 111 111 111 -> 111 111 100
111 111 100 AND 110 110 110 -> 110 110 100

4. 步骤3的值转换为八进制
111 111 100 -> 774
110 110 100 -> 664

为什么 root的umask是0022,而普通用户的umask是0002 ?

理解了umask的原理,再来解释就简单多了,root用户创建的文件安全要求更高。root用户创建的文件只有它本人有绝对控制权,属组和其它人只能浏览文件列表。而普通用户创建的文件,可能同一属组的用户也需要修改,比如alice创建了文件a,如果bob也加入alice用户组,则bob也可以修改文件a。

(3) 修改umask

1. 直接指定八进制数字
# umask 0003

2. 符号表示法,详情见wiki,下面表示只有其它人要掩去w和x权限,等同于0003
# umask ug=rwx,o-wx

3. 文件隐藏的属性

文件除了基本r, w, x权限外,在Linux传统的 ext2 / ext3 / ext4 文件系统下,我们还可以设定其他的 系统隐藏属性,比如设置文件不可修改属性后,就算是属主也不能修改文件内容。

CentOS7默认的文件系统是XFS,它仅支持设置文件AadiS隐藏属性。

3.1 查看隐藏属性

使用lsattr命令可以查看目录文件或一般文件的隐藏属性,默认为空。常用选项:

  • -a 查看包括以.开头的隐藏文件在内的所有文件的隐藏属性
  • -d 只查看目录文件本身,而非它里面的文件列表的隐藏属性
  • -R 递归查看目录
  • -v 查看文件版本号/代号
[root@External ~]# touch test.txt
[root@External ~]# lsattr
---------------- ./test.txt

3.2 修改隐藏属性

使用chattr命令可以修改目录文件或一般文件的隐藏属性,语法为chattr [+-=][AadiS] filename,可选的-R选项表示递归修改,常用属性:

  • + 增加某一个特殊参数,其他原本存在参数则不动。
  • - 移除某一个特殊参数,其他原本存在参数则不动。
  • = 设定仅有等号后面的参数
  • a 只有root用户可以设置此属性。文件只能在追加模式下(即重定向>>)才能写入内容,不能删除此文件
  • i 只有root用户可以设置此属性。文件不能被修改,不能被删除或重命名,不能创建该文件的链接,也不能将数据写入文件
# chattr +ai test.txt
# lsattr test.txt
----ia---------- test.txt

4. 文件的特殊权限

特殊权限不同于传统的权限,它们当前用户执行文件的过程中临时被赋予的一些特殊权限。

4.1 SUID

s出现在文件属主的x权限位置上时,称为Set UID,简称SUID。它的要求与功能:

  • SUID仅对二进制程序(binary program)有效,不能够用在shell脚本上(因为shell脚本是由一系列命令组成,所以是看它里面的程序是不是拥有SUID,而不是看shell脚本它本身),对目录也无效
  • 用户需要拥有此程序的x可执行权限
  • 当用户运行此程序时,将临时(run-time)获取与此程序属主等同的权限,程序结束时失效
1. 说明此文件只有root用户可以强制写入
# ls -l /etc/shadow
---------- 1 root root 994 Apr 11 08:00 /etc/shadow

2. 普通用户拥有r和x权限,注意它的属主权限位本来是x的位置,现在是小写的s,表示SUID
# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

Linux系统中的用户密码都是存储在/etc/shadow中的,根据它的权限,普通用户是没办法修改它的,那么为什么普通用户又可以自己修改密码呢?

原因是,用户修改密码都是执行/usr/bin/passwd命令,因为所有人都有它的执行权限。此文件有SUID特殊权限,当普通用户运行此程序时,将临时获取属主root的权限,这样/etc/shadow就能被普通用户所运行的passwd程序所修改。

4.2 SGID

s出现在文件属组的x权限位置上时,称为Set GID,简称SGID。与SUID不同的是,SGID对文件或目录都有效

(1) 设置目录文件的SGID

一般SGID用于目录文件,当一个目录设置了SGID权限后,它的要求与功能:

  • 用户需要拥有该目录rx权限(即能够进入该目录)
  • 用户在该目录下的有效群组(effective group)将会变成该目录的属组
  • 如果用户还拥有该目录的w权限,则用户所新建的文件,其属组与该目录的属组相同,这样该群组内的其它用户也可以编辑刚新建的文件了,主要用于协同共享编辑

假设系统中有两个账号,分别为alice和bob,这两个用户除了自己的基本属组外还共同有一个project属组。如果这两个用户需要共同拥有/git/code/目录的所有权,且不允许其它人进入查询,应该如何设置该目录的权限呢?

1. 创建用户组及用户
# groupadd project
# useradd -G project alice
# useradd -G project bob
# id alice
uid=1001(alice) gid=1003(alice) groups=1003(alice),1002(project)
# id bob
uid=1002(bob) gid=1004(bob) groups=1004(bob),1002(project)

2. 创建共享目录
# mkdir -p /git/code
# ls -ld /git/code
drwxr-xr-x 2 root root 6 May 15 13:38 /git/code

3. 修改目录权限,只有project组内的用户能修改,其它人不能进入此目录
# chgrp project /git/code/
# chmod 770 /git/code/
# ls -ld /git/code/
drwxrwx--- 2 root project 6 May 15 13:38 /git/code/

4. 测试,注意各个用户创建的文件属组都是他们自己,那么其它用户相当于other,只有r权限
# su - alice
$ umask
0002
$ cd /git/code/
$ touch alice.txt
$ ls -l
total 0
-rw-rw-r-- 1 alice alice 0 May 15 13:41 alice.txt
$ exit
logout

# su - bob
$ cd /git/code/
$ ls -l
total 0
-rw-rw-r-- 1 alice alice 0 May 15 13:41 alice.txt
$ echo "I am bob" >> alice.txt  # 说明: alice用户创建的文件alice.txt,属组是alice,那bob用户对应other只有r权限,结合bob对目录/git/code的权限,bob只能删除alice.txt文件,却不能编辑它,不符合要求
-bash: alice.txt: Permission denied
$ exit
logout

5. 结合SGID
# chmod 2770 /git/code/
# ls -ld /git/code/
drwxrws--- 2 root project 36 May 15 13:42 /git/code/

# su - alice
Last login: Mon May 15 13:41:18 CST 2017 on pts/0
$ cd /git/code/
$ touch alice2.txt
$ ls -l
total 0
-rw-rw-r-- 1 alice project 0 May 15 13:46 alice2.txt  # 注意新建文件的属组变为project了
-rw-rw-r-- 1 alice alice   0 May 15 13:41 alice.txt
$ exit
logout

# su - bob
Last login: Mon May 15 13:42:14 CST 2017 on pts/0
$ cd /git/code/
$ echo "I am bob" >> alice2.txt
$ cat alice2.txt
I am bob

(2) 设置一般文件的SGID

对于一般文件来说,SGID表示二进制程序将在文件属组的权限下运行:

  • SGID对二进制程序有效
  • 用户需要具有该程序的x可执行权限
  • 当用户运行此程序时,将临时(run-time)获取与此程序属组等同的权限,程序结束时失效
1. locate具有SGID特殊权限位
# ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10  2014 /usr/bin/locate

2. 属主root有rw权限,属组slocate有r权限,而其它人比如普通用户alice没有任何权限
# ls -l /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 910625 May 15 03:17 /var/lib/mlocate/mlocate.db

普通用户没有读取/var/lib/mlocate/mlocate.db的权限,那么他们是怎么使用locate命令去查找此数据库内容的呢?

与SUID类似,当用普通用户alice执行locate时,将会暂时取得/var/lib/mlocate/mlocate.db文件属组slocate的权限,这样就可以读取mlocate.db文件的内容了。

4.3 SBIT

s出现在文件其它人的x权限位置上时,称为Sticky Bit,简称SBIT只对目录有效。它的要求与功能:

  • 用户需要拥有此目录的wx权限
  • 当用户在此目录下新建文件或目录时,仅有自己与root用户才有权限删除该文件或目录

其实/tmp目录就是使用了SBIT,本来/tmp目录是所有人都能读写的,那么要设置为777,但是不能随意删除别人的文件,所以加了SBIT,演示如下:

# ls -ld /tmp
drwxrwxrwt. 7 root root 4096 May 15 13:55 /tmp
# cd /tmp
# touch root.txt
# chmod 777 root.txt 
# ls -l
-rwxrwxrwx 1 root root    0 May 15 13:58 root.txt

# su - alice
Last login: Mon May 15 13:49:34 CST 2017 on pts/0
$ cd /tmp
$ rm root.txt 
rm: cannot remove ‘root.txt’: Operation not permitted

案例: 假设导师新建一个目录用来收集各位同学的毕业论文,可以将此目录属组改为student且属组权限为rwx,并将学生的额外组设定为student。那么此时,学生A在此目录下新建论文文件A.doc,虽然学生B对A.doc只有r权限,但由于学生B对此目录有rwx权限,所以学生B可能因为嫉妒A,可以把A.doc删除掉,让导师误以为学生A没有提交论文。此时,导师应该将此目录权限设置为1770,这样只有学生A和root用户能删除A.doc

4.4 设置SUID/SGID/SBIT

设置特殊权限位,只需要在三位八进制普通权限前面再加上一个数字即可,chmod [OPTION] MODE FILE...:

  • 4 代表设置SUID
  • 2 代表设置SGID
  • 1 代表设置SBIT

或者使用符号法:

  • u+s 代表设置SUID
  • g+s 代表设置SGID
  • o+t 代表设置SBIT
二进制 八进制 描述
000 0 清空所有特殊权限位
001 1 设置SBIT
010 2 设置SGID
011 3 设置SGID和SBIT
100 4 设置SUID
101 5 设置SUID和SBIT
110 6 设置SUID和SGID
111 7 设置所有特殊权限位
# touch testfile
# ls -l testfile 
-rw-r--r-- 1 root root 0 May 15 14:19 testfile
# chmod 4644 testfile 
# ls -l testfile 
-rwSr--r-- 1 root root 0 May 15 14:19 testfile  # 注意: 属主x权限位上显示为S,因为其本来就没有x权限,所以不是正常的小写s,而是S代表空的SUID

# chmod 4755 testfile 
# ls -l testfile 
-rwsr-xr-x 1 root root 0 May 15 14:19 testfile
# chmod 2755 testfile 
# ls -l testfile 
-rwxr-sr-x 1 root root 0 May 15 14:19 testfile

# mkdir testdir
# ls -ld testdir/
drwxr-xr-x 2 root root 6 May 15 14:22 testdir/
# chmod 1755 testdir/
# ls -ld testdir/
drwxr-xr-t 2 root root 6 May 15 14:22 testdir/

5. 访问控制列表 ACL

ACL(Access Control List)是除了普通权限owner/group/other外的更细粒度权限控制,比如普通用户alice创建了目录文件shared-dir,它的预设权限为drwxrwxr-x,如果只想让bob(不是所有other)有写权限怎么办?

ACL可以针对以下几方面的权限控制:

  • 可以单独设置某个user(非文件属主)对文件的权限
  • 可以单独设置某个group(非文件属组)对文件的权限

目前几乎所有的Linux文件系统都支持ACL参数,CentOS6需要在/etc/fstab挂载文件系统中显示指定acl参数,而CentOS7的XFS文件系统默认已经启用ACL了,我们只需要确认一下内核是不是已经启动ACL即可:

# dmesg | grep -i acl
[    1.453065] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4
 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)[    1.924547] SGI XFS with ACLs, security attributes, no debug enabled

5.1 查看ACL

如果用ls -l命令查看文件的详细信息时,权限列的最后有一个+,表示此文件有ACL

$ ls -ld /tmp/shared-dir/
drwxrwxr-x+ 2 alice  alice   15 Apr 12 12:48 shared-dir

要查看它的ACL,请使用getfacl命令

$ getfacl shared-dir/
# file: shared-dir/
# owner: alice
# group: alice
user::rwx      # 文件的属主权限
user:bob:rwx   # 添加的ACL
group::rwx     # 文件的属组权限
mask::rwx      # bob对此文件的真正权限是ACL与mask作AND运算后的结果。假设ACL给了rwx,而mask是r--,那么bob还是只有r--权限。mask默认是rwx
other::r-x     # 文件的非属主或属组内用户的权限

5.2 设置ACL

使用setfacl -m命令设置ACL,选项-R表示递归设置

  • u:用户名:权限 设置用户的ACL
  • g:组名:权限 设置用户组的ACL
  • m::权限 设置mask
1. alice创建/tmp/shared-dir
# su - alice
$ mkdir /tmp/shared-dir
$ ls -ld /tmp/shared-dir/
drwxrwxr-x 2 alice alice 6 Apr 12 12:44 /tmp/shared-dir

2. bob不能在此目录创建新文件
# su - bob
$ cd shared-dir/
$ touch a
touch: cannot touch ‘a’: Permission denied

3. alice设置ACL
$ setfacl -m u:bob:rwx shared-dir/

4. bob再次测试
$ cd shared-dir/
$ touch file1
$ mkdir dir1

设置default:

观察bob创建的目录文件或一般文件的权限:

$ ls -l
total 0
drwxrwxr-x 2 bob bob 6 Apr 12 13:29 dir1
-rw-rw-r-- 1 bob bob 0 Apr 12 13:29 file1

发现并没有保持bob的ACL,权限列最后没有+,要实现这一功能,需要指定default:

1. alice重新设置bob的ACL,加上default
$ setfacl -m d:u:bob:rwx shared-dir/
$ getfacl shared-dir/
# file: shared-dir/
# owner: alice
# group: alice
user::rwx
user:bob:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:bob:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

2. bob再次测试
$ touch file2
$ mkdir dir2
$ ls -l
total 0
drwxrwxr-x  2 bob bob 6 Apr 12 13:29 dir1
drwxrwxr-x+ 2 bob bob 6 Apr 12 13:32 dir2
-rw-rw-r--  1 bob bob 0 Apr 12 13:29 file1
-rw-rw-r--+ 1 bob bob 0 Apr 12 13:32 file2

修改mask:

mask默认是rwx,它表示可以授予的权限,如果设置mask为x,表示将拿掉所有组和命名用户的rw权限 Revoking read and write access from all groups and all named users (using the effective rights mask)

1. alice设置student用户组有r权限
$ setfacl -m g:student:r shared-dir/

2. alice设置mask为仅有x权限
$ setfacl -m m::x shared-dir/

3. 查看权限
$ getfacl shared-dir/
# file: shared-dir/
# owner: alice
# group: alice
user::rwx
user:bob:rwx            #effective:--x
group::rwx              #effective:--x
group:student:r--       #effective:---
mask::--x
other::r-x

5.3 取消ACL

使用setfacl -x命令取消ACL,不需要指明具体的权限

$ setfacl -x g:student shared-dir/
$ getfacl shared-dir/
# file: shared-dir/
# owner: alice
# group: alice
user::rwx
user:bob:rwx
group::rwx
mask::rwx
other::r-x

使用setfacl -b命令清空文件所有ACL

$ setfacl -b shared-dir/
$ getfacl shared-dir/
# file: shared-dir/
# owner: alice
# group: alice
user::rwx
group::rwx
other::r-x
未经允许不得转载: LIFE & SHARE - 王颜公子 » Linux文件权限管理看这篇就够了

分享

作者

作者头像

Madman

如果博文内容有误或其它任何问题,欢迎留言评论,我会尽快回复; 或者通过QQ、微信等联系我

0 条评论

暂时还没有评论.

发表评论前请先登录

专题