Linux常用命令--文件与目录的权限管理

摘要

  • 文件与目录的授权(ACL)等相关命令

  • 本文基于CentOS8(x86_64)

文件与目录的权限管理

小贴士
文件系统构成

1
2
3
4
5
6
7
8
9
10
11
12
13
/usr/bin 、/bin:存放所有用户都可以执行的命令
/usr/sbin 、/sbin:存放只有root用户可以执行的命令
/home:用户缺省宿主目录
/proc:虚拟文件目录,存放当前进程信息
/dev:设备文件
/lib:系统运行所需的共享库
/lost+found:存放系统出错的检查结果
/tmp:临时文件
/etc:系统配置文件
/var:经常变动的文件,如邮件,日志,计划任务
/usr:库,手册,第三方程序一般安装在/usr/local下
/boot:内核文件
/mnt:临时挂载点

文件类型和文件权限
当我们通过ls -l查看文件列表信息时,会看到文件类型和权限、文件所属用户和用户组、最后修改时间等等:

1
2
3
drwxr-xr-x 6 root root    4096 7月  23 2021 apache-maven-3.8.1
-rw-r--r-- 1 root root 9536838 3月 31 2021 apache-maven-3.8.1-bin.tar.gz
lrwxrwxrwx 1 root root 18 7月 23 2021 maven -> apache-maven-3.8.1

第一列展示的就是文件权限,如drwxr-xr-x

1
2
3
4
5
6
7
8
第一个字符表示文件类型:
- 表示普通文件
d 表示目录
l 表示符号链接
c 表示字符设备文件
b 表示块设备文件
s 表示套接字文件
p 表示管道文件

也可以通过file命令查看文件类型

1
2
3
4
5
6
$ file apache-maven-3.8.1
apache-maven-3.8.1: directory
$ file apache-maven-3.8.1-bin.tar.gz
apache-maven-3.8.1-bin.tar.gz: gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT)
$ file maven
maven: symbolic link to `apache-maven-3.8.1'
1
2
3
4
5
6
第一列的其余 9 个字符表示文件或目录的访问权限,分别对应三个字符一组的 rwx 权限,
每3位分别代表文件所有者权限,文件所属组权限,其它用户和组的权限:
r 表示读取权限
w 表示写入权限
x 表示执行权限
- 表示没有对应权限

1.改变文件或目录权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
chmod u+x file/dir

u:文件所有者
g:文件所属组
o:其它用户和组
a:所有用户所有组

+:赋予权限 -:去除权限

r:读权限   文件--可以查看  目录--可以列出目录内容
w:写权限   文件--可以修改  目录--可以在目录中创建、删除文件和目录
x:执行权限 文件--可以执行文件 目录--可以进入目录

注:对于目录,如有r权限,则必须有x权限。

chmod 751 file : 相当于rwxr-x--x
r->4
w->2
x->1

2.改变文件或目录所有者和所属组

1
2
3
4
5
chown user file :将file的所有者修改为user

chgrp group file :将file的所属组修改为group

chown -R user.group dir :修改dir及其子目录的所有者和所属组 

3.为可执行程序赋予SetUID与SetGID权限

  • 当一个可执行程序具有SetUID权限,用户执行这个程序时将以这个程序所有者身份执行。

  • 当一个可执行程序具有SetGID权限,用户执行这个程序时将以这个程序所属组身份执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 设置SetUID
chmod u+s 程序
chmod 4755 程序 : 权限从3位数字变成了4位数字,SetUID权限用数字4表示
# 取消SetUID
chmod u-s 程序
chmod 755 程序

# 设置SetGID
chmod g+s 程序
chmod 2755 程序 : 权限从3位数字变成了4位数字,SetGID权限用数字2表示
# 取消SetGID
chmod g-s 程序
chmod 755 程序

# 示例
ll test.sh : 初始权限
-rwxr-xr-x 1 root root 0 3月 3 15:44 test.sh

chmod u+s test.sh : 增加SetUID权限

ll test.sh
-rwSr-xr-x 1 root root 0 3月 3 15:44 test.sh

此时可以看到root用户的执行权限从小写的x变成了大写的S,表示任何用户执行test.sh,都会以root用户身份执行

chmod u-s test.sh : 去掉SetUID权限
chmod g+s test.sh : 增加SetGID权限

ll test.sh
-rwxr-Sr-x 1 root root 0 3月 3 15:44 test.sh

此时可以看到root用户组的执行权限从小写的x变成了大写的S,表示任何用户执行test.sh,都会以root用户组的身份执行

# 在根路径下查找具有SetUID和SetGID程序:
find / -perm -4000 -o -perm -2000

4.ACL授权

  • ACL授权比chmod更加灵活,也更加精细化,它可以为每个用户或组单独设置一套访问权限

添加或修改ACL权限

  • 语法格式

1
2
3
4
5
setfacl -m [权限规则] dir[file]

权限规则:
u[设置用户]:username[用户名]:rwx[设置权限]
g[设置组]:groupname[组名]:rwx[设置权限]
  • 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-rw-r--r-- 1 root root 0 3月   9 11:25 file
drwxr-xr-x 2 root root 4096 3月 9 11:36 dir

# 为hanqf用户设置file文件的访问权限为rw
setfacl -m u:hanqf:rw file
# 为hanqf用户设置dir文件的访问权限为rwx
setfacl -m u:hanqf:rwx dir

-rw-rw-r--+ 1 root root 0 3月 9 11:25 file
drwxrwxr-x+ 2 root root 4096 3月 9 11:35 dir
此时可以看到file和dir的权限后面多了一个加号标志,同时其组权限也发生了变化,这个我们后面讲

# 为hanqf用户组设置file文件的访问权限为rwx
setfacl -m g:hanqf:rw file
# 为hanqf用户组设置dir文件的访问权限为rwx
setfacl -m g:hanqf:rwx dir

-rw-rwxr--+ 1 root root 0 3月 9 11:25 file
drwxrwxr-x+ 2 root root 4096 3月 9 11:35 dir
此时同样可以看到file和dir的权限后面多了一个加号标志,同时其组权限也发生了变化,这个我们后面讲

所以,只要看到文件或目录权限后面有个加号,就说明被设置ACL权限

# -R : 递归设置子目录下的权限
setfacl -m u:hanqf:r -R dir #同时设置子目录下的权限

查看ACL权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ getfacl file  #查看该文件被设置的所有acl权限
# file: dir
# owner: root
# group: root
user::rwx
user:hanqf:rw-
group::r-x
group:hanqf:rwx
mask::rwx
other::r-x

$ getfacl dir #查看该目录被设置的所有acl权限
# file: dir
# owner: root
# group: root
user::rwx
user:hanqf:rwx
group::r-x
group:hanqf:rwx
mask::rwx
other::r-x

$ getfacl --omit-header file :去掉头信息
user::rwx
user:hanqf:rw-
group::r-x
group:hanqf:rwx
mask::rwx
other::r-x

小贴士

  • 文件所有者权限:ACL_USER_OBJ
    user::rwx
  • 指定某些用户的权限,一行显示一个:ACL_USER
    user:hanqf:rw-
  • 文件所属组权限:ACL_GROUP
    group::r-x
  • 指定某些用户组的权限,一行显示一个:ACL_GROUP_OBJ
    group:hanqf:rwx
  • mask权限,ACL_USER, ACL_GROUPACL_GROUP_OBJ中的最大值,即rwx转换为数字后的和
    mask::rwx
  • 其它用户和组的权限
    other::r-x

mask限制ACL权限最大值

  • 上面我们在给文件或目录设置ACL权限后,通过ls -l命令查看文件或目录权限时,发现组权限也发生了变化,

  • 实际上这里的组权限显示的是maskmask用于限制ACL_USER, ACL_GROUPACL_GROUP_OBJ中的最大值,即rwx转换为数字后的和

  • 我们也可以设置mask的值

1
2
3
4
5
6
7
8
9
10
11
12
$ setfacl -m mask::r-- file

$ getfacl --omit-header file
user::rw-
user:hanqf:rw- #effective:r--
group::r--
group:hanqf:rwx #effective:r--
mask::r--
other::r--

$ ls -l file
-rw-r--r--+ 1 root root 0 3月 9 11:25 file
  • 此时会看到相应的权限后面多出了#effective:r--,我们设置mask的权限只有读权限,这样即便我们之前设置了hanqf用户的读写权限,此时也失效了,所以实际的权限也是r--

  • mask不会限制other的权限

Default ACL 设置

  • 如果希望任何人在dir下创建的文件都对被指定的用户拥有相同的权限,那么我们就应该对dir目录设置 Default ACL

1
2
3
4
5
6
7
8
9
10
11
# -d 缺省设置,这样,任何人在该dir目录下创建的文件,都可以被hanqf读写
$ setfacl -d -m user:hanqf:rw dir
$ getfacl --omit-header dir
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:hanqf:rw-
default:group::r-x
default:mask::rwx
default:other::r-x
  • Default ACL 只针对设置后新创建的文件才有效

  • 取消 Default ACL

1
2
3
4
5
6
7
$ setfacl -k dir
$ getfacl dir
user::rwx
user:hanqf:rw-
group::r-x
mask::rwx
other::r-x

删除ACL权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 删除用户的权限
setfacl -x u:username file
setfacl -x u:username dir
setfacl -x u:username -R dir

# 删除组的权限
setfacl -x g:groupname file
setfacl -x g:groupname dir
setfacl -x g:groupname -R dir

# 删除全部acl权限
setfacl -b file
setfacl -b dir
setfacl -b -R dir
  • ACL权限删除后,对应文件或目录权限上的加号就会去掉

5.粘着位

  • 如果一个权限为777的目录被设置了粘着位,则每个用户都可以在该目录下创建文件,但只能删除自己创建的文件

1
2
3
4
5
6
7
8
9
# 设置:
chmod o+t dir
# 或者
chmod 1777 dir

# 取消:
chmod o-t dir
# 或者
chmod 777 dir