封面来源:https://www.ninjaone.com/wp-content/uploads/2024/03/N1-0921-Linux-Administration-and-User-Management-blog-image-1.png

引言

在上一期内容中,我们探讨了 Linux 中用户与组的基础概念,了解了 root 用户、普通用户和系统用户之间的区别,以及如何创建和管理它们。不过,光有用户和组的划分还不够——Linux 作为“一切皆文件”的系统,如果权限设置不到位,很多时候能防得住正常使用的误操作,却防不住那些刻意“偷家”(通过某些方式,获取其他授权工作组的用户账户以绕过限制)的乱搞行为。

那么,有没有更强大的方法,能够精准镇住这些搞破坏的操作呢?这就是我们今天要讲的 Linux 权限体系中另一个核心机制——文件权限控制

从哪里开始?

答案是 ls

ls 这个命令我们已经非常熟悉了,一般是用来显示当前目录下的所有非隐藏文件。事实上,这个命令也是有很多参数的,但是今天我们只用到下面这几个:

参数

含义

-a

列出所有文件,包括 . 和 .. 以及所有的隐藏文件

-A

列出所有除了 . 和 .. 以外的文件,包括隐藏文件

-l

按照“权限 所有者 所属工作组 大小 修改时间 名称”的格式列出所有非隐藏文件

-1

每个文件一行,列出所有非隐藏文件

使用缺省目录(即不指定任何目录)时,默认为当前目录

列出文件时,ls 一般会使用彩色输出,各个颜色对应的文件类型如下:

  • 蓝色:目录

  • 绿色:可执行文件

  • 红色:压缩文件

  • 青色:链接文件

  • 黄色:设备文件

文件权限简介

如果我们使用 ls -l 命令列出该目录下的文件,那么在终端内应该能够看到类似于下面的结果:

其中,前面的10个字符,比如说倒数第二行的“-rw-r--r--”,指的是该文件的权限。它是什么意思呢?

先看第一个字符。它一般有下面几种类型:

字符

含义

-

普通文件或硬链接

d

目录

l

软链接

c

字符设备(终端)

b

块设备(硬盘)

所以,我们在上面看到的"d"就指代的是目录,而"-"指的是普通文件。

接下来,后面的 9 个字符才是该文件真正的权限。你可能会发现,最后一个文件的后面 9 个字符出现的非常规律——事实上,这 9 个字符叫做“文件模式”,通常会被从左到右平均分为 3 组:所有者(1 → 3),所在用户组(4 → 6),所有用户(7 → 9)。各个组其中的每一个字符都代表其具有的权限:r 指代读(Read)w 指代写(Write)x 指代执行(Execute),而 - 指代该权限被禁用。

那么,"-rwxrwxrwx"就可以表述为:这里有一个普通文件,它的所有者、所在用户组内所有用户和其他所有用户都可以对其进行读取、写入以及执行操作。这个权限是相当危险的,因为任何人都能随意修改其内容,如果这个文件属于系统关键文件,则后果不堪设想。

权限的控制

我们可以使用 chmod 命令更改文件的权限。它有 2 种方式:

  1. 符号模式(相对模式)。这种方式使用上面提到的字符(注意大小写敏感!)来代表用户类别和权限,通过 +-= 运算符来增加、移除或设置权限。它更直观,适合在现有权限基础上进行微调。

  2. 八进制数字模式(绝对模式)。这种方式使用一个三位(涉及组权限时,为四位)的八进制数字来直接设置权限。每一位数字代表一个用户类别(所有者、组、其他)的权限总和。它更精确、高效,适合直接指定完整的权限。

符号模式

这种方式使用字符来代表用户类别和权限,通过 +-= 运算符来增加、移除或设置权限。它更直观,适合在现有权限基础上进行微调。

此时,chmod 命令带有后面 4 个部分:用户类别,操作符,权限,文件名。

先说用户类别。它有下面 4 个选项:

  • u: 文件所有者

  • g: 文件所属的用户组或工作组

  • o: 系统内的其他用户

  • a: 所有用户(可以视为前三者的并集)

下面我们来看操作符。正如之前所说,+ 用于增加权限,- 用于移除权限,而 = 用于精确设置权限。

最后,关于权限,其实和之前 ls -l 命令列出来的权限是完全一样的,无非就是 rwx 三种。

举个例子:现在有一个文件名为 UbuntuLTS.sh,初始权限是 -rwxrw-r--.

现在我们要为所有用户添加执行权限:

chmod a+x UbuntuLTS.sh

移除所属用户组其他用户写入权限:

chmod go-w UbuntuLTS.sh

其他用户只能读取执行

chmod o=rx UbuntuLTS.sh

只有所有者拥有全部权限:

chmod u+rwx,go-rwx UbuntuLTS.sh

注意:省略用户类别时(例如 chmod +x UbuntuLTS.sh),默认对所有用户生效。

八进制数字模式

这种方式使用一个三位的八进制数字来直接设置权限。每一位数字代表一个用户类别(所有者、组、其他)的权限总和。它更精确、高效,适合直接指定完整的权限,但缺点也显而易见,需要花时间计算。

此时,chmod 命令带有后面 2 个部分:权限的八进制数值,文件名。

每个权限对应的数字如下表:

权限

r

w

x

-

含义

读取

写入

执行

无权限

八进制数值

4

2

1

0

将所需权限的数字相加,可以得到该用户类别的权限值。

举个例子,现在有一个文件名为 scan-wifi.sh,初始权限是 -rwxrwxr--.

设置权限为 rwxr-xr--:

chmod 754 scan-wifi.sh
# Explanation:
# rwx = 4 + 2 + 1 = 7
# r-x = 4 + 0 + 1 = 5
# r-- = 4 + 0 + 0 = 4
# So rwxr-xr-- is 754.

设置权限为 rw-r--r--(这也是常见的默认文件权限):

chmod 744 scan-wifi.sh

只有文件的所有者可以修改:

chmod 755 scan-wifi.sh
# Permission: rwxr-xr-x

更改所有者

我们可以使用 chown 命令更改一个或多个文件的所有者

它的用法非常简单,这里我们就不再赘述了:

chown user:group file # and file2, file3, ...

请注意,user, group 和 file 必须存在,冒号后面不能有空格。

或者,也可以使用 chgrp 命令(和上面一样):

chgrp group file

复制文件权限到另一个

在上面两个命令中,使用 --reference 选项可以将某个文件的权限复制到另一个文件上。例如:

chown --reference=ubuntults.sh debian.sh
chgrp --reference=ubuntults.sh debian.sh

为文件或目录设置组权限

同样的,我们也可以使用 chmod 命令,通过符号模式或八进制数字模式为文件或目录设置组权限。

符号模式,通过设置 GID(对应 s ),组内所有用户均可访问该文件:

chmod g+s debian-to-kali.sh

八进制数字模式,此时是四位八进制数字权限,应在权限代码最开始加上 2(代表 GID):

chmod 2755 debian-to-kali-script # This is a directory

当作用对象是文件时,会让执行该文件的用户临时拥有文件所属组的权限

当作用对象是目录时,任何在此目录下新创建的文件或子目录,将不会继承创建者的主要组,而是自动继承该目录本身的所属组

如果想要更精细的权限管理,建议使用 umask 命令或访问控制列表(Access Control Lists, ACLs)。

总结

让我们回顾一下关于 Linux 用户与权限控制的核心要点:

  1. 用户与组是权限的基石:通过区分 root、系统用户和普通用户,并利用组(主要组与附加组)来批量管理用户权限,Linux 在系统层面建立了清晰的身份与权限边界。

  2. 文件权限是资源访问的守门人:经典的“读(r)、写(w)、执行(x)”权限与“用户(u)、组(g)、其他(o)”的三元组合,构成了文件与目录访问控制的基础。chmod(修改权限)和 chown(修改所有者与属组)是配置这一切的核心工具。

  3. 特殊权限提供了灵活性:像 SetGID 这样的特殊权限,在特定场景下(如协作目录)极大地简化了权限管理,实现了文件属组的自动继承,确保了团队协作的顺畅。

掌握从用户、组到文件权限,再到特殊权限与ACL的这一套完整体系,我们将能够为任何 Linux 系统构建起一道坚固而灵活的安全防线,真正做到既防止误操作,又能有效管控越权行为。

C/C++ 新人开发者,主攻 UE5,业余 Linux 运维