封面来源: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 这个命令我们已经非常熟悉了,一般是用来显示当前目录下的所有非隐藏文件。事实上,这个命令也是有很多参数的,但是今天我们只用到下面这几个:
使用缺省目录(即不指定任何目录)时,默认为当前目录。
列出文件时,ls 一般会使用彩色输出,各个颜色对应的文件类型如下:
蓝色:目录
绿色:可执行文件
红色:压缩文件
青色:链接文件
黄色:设备文件
文件权限简介
如果我们使用 ls -l 命令列出该目录下的文件,那么在终端内应该能够看到类似于下面的结果:

其中,前面的10个字符,比如说倒数第二行的“-rw-r--r--”,指的是该文件的权限。它是什么意思呢?
先看第一个字符。它一般有下面几种类型:
所以,我们在上面看到的"d"就指代的是目录,而"-"指的是普通文件。
接下来,后面的 9 个字符才是该文件真正的权限。你可能会发现,最后一个文件的后面 9 个字符出现的非常规律——事实上,这 9 个字符叫做“文件模式”,通常会被从左到右平均分为 3 组:所有者(1 → 3),所在用户组(4 → 6),所有用户(7 → 9)。各个组其中的每一个字符都代表其具有的权限:r 指代读(Read),w 指代写(Write),x 指代执行(Execute),而 - 指代该权限被禁用。
那么,"-rwxrwxrwx"就可以表述为:这里有一个普通文件,它的所有者、所在用户组内所有用户和其他所有用户都可以对其进行读取、写入以及执行操作。这个权限是相当危险的,因为任何人都能随意修改其内容,如果这个文件属于系统关键文件,则后果不堪设想。
权限的控制
我们可以使用 chmod 命令更改文件的权限。它有 2 种方式:
符号模式(相对模式)。这种方式使用上面提到的字符(注意大小写敏感!)来代表用户类别和权限,通过
+、-、=运算符来增加、移除或设置权限。它更直观,适合在现有权限基础上进行微调。八进制数字模式(绝对模式)。这种方式使用一个三位(涉及组权限时,为四位)的八进制数字来直接设置权限。每一位数字代表一个用户类别(所有者、组、其他)的权限总和。它更精确、高效,适合直接指定完整的权限。
符号模式
这种方式使用字符来代表用户类别和权限,通过 +、-、= 运算符来增加、移除或设置权限。它更直观,适合在现有权限基础上进行微调。
此时,chmod 命令带有后面 4 个部分:用户类别,操作符,权限,文件名。
先说用户类别。它有下面 4 个选项:
u: 文件所有者g: 文件所属的用户组或工作组o: 系统内的其他用户a: 所有用户(可以视为前三者的并集)
下面我们来看操作符。正如之前所说,+ 用于增加权限,- 用于移除权限,而 = 用于精确设置权限。
最后,关于权限,其实和之前 ls -l 命令列出来的权限是完全一样的,无非就是 r,w 和 x 三种。
举个例子:现在有一个文件名为 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 个部分:权限的八进制数值,文件名。
每个权限对应的数字如下表:
将所需权限的数字相加,可以得到该用户类别的权限值。
举个例子,现在有一个文件名为 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.shchgrp --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 用户与权限控制的核心要点:
用户与组是权限的基石:通过区分 root、系统用户和普通用户,并利用组(主要组与附加组)来批量管理用户权限,Linux 在系统层面建立了清晰的身份与权限边界。
文件权限是资源访问的守门人:经典的“读(r)、写(w)、执行(x)”权限与“用户(u)、组(g)、其他(o)”的三元组合,构成了文件与目录访问控制的基础。
chmod(修改权限)和chown(修改所有者与属组)是配置这一切的核心工具。特殊权限提供了灵活性:像 SetGID 这样的特殊权限,在特定场景下(如协作目录)极大地简化了权限管理,实现了文件属组的自动继承,确保了团队协作的顺畅。
掌握从用户、组到文件权限,再到特殊权限与ACL的这一套完整体系,我们将能够为任何 Linux 系统构建起一道坚固而灵活的安全防线,真正做到既防止误操作,又能有效管控越权行为。