☰
Linux 指令 贰
2026/9/26 4:17:47 网站建设 项目流程

1. 认识文件权限:从 ls -l 说起

在 Linux 中,一切皆文件。要理解权限系统,最好的起点是ls -l命令的输出。它用一行紧凑的字符串,同时告诉我们文件类型、访问权限、属主、属组和大小等信息。

-rw-r--r-- 1 user group 1024 Jan 1 10:00 file.txt

这一行输出可以拆解为几个部分:

  • 第一位:文件类型标识符,- 表示普通文件。
  • 接下来九位:访问权限,分为三组,每组三位,分别对应属主、属组、其他用户。
  • user group:文件的属主和属组。
  • 1024:文件大小(字节)。
  • Jan 1 10:00:最后修改时间。
  • file.txt:文件名。

1.1 常见文件类型标识符

ls -l 输出的第一个字符用于标识文件类型,常见的有:

  • -:普通文件
  • d:目录
  • l:符号链接
  • c:字符设备文件
  • b:块设备文件
  • p:管道文件
  • s:套接字文件

1.2 权限字段解析

接下来九位权限字符分为三组,每组三位,顺序固定为读(r)、写(w)、执行(x):

  • 第一组(rw-):属主权限,本例为读、写、无执行。
  • 第二组(r--):属组权限,本例为读、无写、无执行。
  • 第三组(r--):其他用户权限,本例为读、无写、无执行。

权限位缺失时用 - 占位。理解了这一行输出,就掌握了阅读任何文件权限信息的基础能力。

2. 权限值表示方法:从符号到数字

符号表示法直观,但书写冗长。Linux 提供了更紧凑的数字表示法:把每组权限换算成八进制数字。每位由三个二进制位组成,分别代表读、写、执行权限,对应数值如下:

  • 读权限(r)= 4
  • 写权限(w)= 2
  • 执行权限(x)= 1

把同一组内的数值相加,就得到该组权限的数字。例如:

  • rwx = 4 + 2 + 1 = 7
  • rw- = 4 + 2 = 6
  • r-- = 4
  • --- = 0

于是三位数字分别对应属主、属组、其他用户的权限。例如:

  • 755:属主有读、写、执行权限(7),属组和其他用户有读和执行权限(5)。
  • 644:属主有读写权限(6),属组和其他用户仅有读权限(4)。

数字表示法简洁高效,是日常使用最频繁的权限写法。

3. 权限检查逻辑:系统如何判定访问权

当用户访问一个文件时,系统按以下顺序判定其权限:

  • 属主优先(user -u):若用户是文件属主,直接使用属主权限,不再向下匹配。
  • 属组匹配(group -g):若用户属于文件属组,使用属组权限。
  • 其他用户(other -o):否则使用其他用户权限。

需要特别注意的是,执行权限是文件能否作为程序运行的前提。只有具备执行权限的文件才能被当作程序执行,这与读、写权限相互独立。

4. 修改权限:chmod 命令

chmod 命令用于修改文件或目录的权限,支持数字模式和符号模式两种写法。

4.1 数字模式

chmod 755 filename

设置文件权限为属主可读写执行,属组和其他用户可读执行。

4.2 符号模式

符号模式通过字母和运算符组合表达权限变更,更灵活,适合只调整部分权限的场景。

chmod u+rwx,g+rx,o-r filename

其中:

  • u:属主
  • g:属组
  • o:其他用户
  • a:所有用户
  • +:添加权限
  • -:移除权限
  • =:设定精确权限

示例:

chmod a-w file.txt # 移除所有用户的写权限 chmod g+w dir/ # 给属组添加写权限

5. 更改属主与属组:chown 和 chgrp

权限的归属由属主和属组决定,因此修改归属也是权限管理的重要环节。

5.1 chgrp:更改所属组

chgrp 命令用于更改文件或目录的所属组。

chgrp newgroup filename

将文件 filename 的组所有权更改为 newgroup。支持递归操作:

chgrp -R newgroup /path/to/directory

递归更改目录及其子项的组。

5.2 chown:更改属主和属组

chown 命令用于更改文件或目录的属主和属组,比 chgrp 更强大。

chown owner filename

仅更改属主。

chown owner:group filename

同时更改属主和属组。

chown user:group file1 file2

同时更改多个文件。

chown -R user:group /path/to/directory

递归更改目录及其子项的属主和属组。

6. 默认权限控制:umask 详解

每次新建文件或目录时,系统都会赋予一个默认权限。umask 就是控制这个默认权限的掩码,它决定了系统在创建文件或目录时自动屏蔽掉哪些权限位。理解 umask 的关键在于:它并不是直接设置权限,而是从默认权限中减去某些权限。

6.1 默认权限基准

  • 新建文件默认权限为 666(即 rw-rw-rw-,无执行权限)
  • 新建目录默认权限为 777(即 rwxrwxrwx,含执行权限)

文件默认不含执行权限,是为了防止误创建可执行文件;目录需要执行权限才能进入,因此默认包含。

6.2 计算规则

实际权限 = 默认权限 - umask 值。umask 中的每一位分别对应属主、属组、其他用户,数值含义与 chmod 一致:读(r)= 4,写(w)= 2,执行(x)= 1。

从位运算的角度看,这个「减去」本质上是按位取反后再与默认权限做按位与:实际权限 = 默认权限 & ~umask。例如 umask 022 的二进制为 000 010 010,取反后为 111 101 101,与默认文件权限666(110 110 110)按位与,得到 110 100 100,即 644。这与「666 - 022 = 644」的结果一致,但按位与的表述更贴近系统底层的真实实现。

例如:

umask 022
  • 新建文件权限:666 - 022 = 644(属主可读写,属组和其他用户只读)
  • 新建目录权限:777 - 022 = 755(属主可读写执行,属组和其他用户可读执行)

再举一个例子:

umask 077
  • 新建文件权限:666 - 077 = 600(仅属主可读写,属组和其他用户无任何权限)
  • 新建目录权限:777 - 077 = 700(仅属主可读写执行,属组和其他用户无任何权限)

6.3 查看当前掩码

umask

直接输入 umask 命令即可查看当前会话的掩码值,通常输出为 0022 或 022 格式。

6.4 临时设置与永久设置

在终端中直接执行 umask 命令只对当前会话生效,关闭终端后失效。若需永久生效,可将设置写入配置文件:

echo "umask 022" >> ~/.bashrc source ~/.bashrc

常见的配置文件包括 /etc/profile(全局生效)、~/.bashrc(当前用户 Bash 生效)、~/.profile 等。修改 /etc/profile 需要 root 权限,建议优先在用户级配置文件中设置。

6.5 常见 umask 值对照

umask 值新建文件权限新建目录权限适用场景
022644755常见默认值,属组和其他用户可读
002664775团队协作,属组可读写
077600700高安全,仅属主可访问
027640750属组可读写,其他用户无权限

7. 特殊权限位:setuid、setgid 与 sticky bit

除了常规的读、写、执行权限,Linux 还提供三种特殊权限位,用于更精细的权限控制。

  • setuid(S):以属主身份执行。设置了 setuid 的可执行文件,运行时以文件属主的身份运行,而非执行者身份。典型例子是 passwd 命令,普通用户通过它修改密码时,能以 root 身份写入 /etc/shadow。
  • setgid(S):以属组身份执行。对可执行文件,运行时以文件属组的身份运行;对目录,新建的文件会自动继承该目录的属组,常用于团队共享目录。
  • sticky bit(t)粘滞位:仅属主可删除。设置了 sticky bit 的目录,只有文件属主、目录属主或 root 才能删除其中的文件,常见于 /tmp 目录。

设置方式:

chmod u+s file # 设置 setuid chmod g+s dir # 设置 setgid chmod +t dir # 设置 sticky bit

8. 识别文件类型:file 命令

在操作文件之前,先确认它的真实类型往往能避免很多错误。file 命令通过读取文件内容特征来识别类型,不依赖扩展名。

file filename

输出文件的实际类型,如:

example.txt: ASCII text image.jpg: JPEG image data, JFIF standard 1.01 script.sh: Bourne-Again shell script, ASCII text executable

可用于判断是否为可执行文件、压缩包、符号链接等。

9. 提权执行:sudo 命令

日常操作中,普通用户权限往往不够。sudo 命令允许授权用户以超级用户或其他用户身份执行命令。

sudo command

需要输入当前用户的密码(前提是用户在 sudoers 列表中)。

示例:

sudo apt update sudo systemctl restart apache2

编辑 sudo 权限配置:

sudo visudo

在配置文件中添加规则,如:

username ALL=(ALL) ALL

允许用户执行任意命令。

10. 系统关机:shutdown 命令

shutdown 命令用于安全关闭系统,它会先通知所有登录用户,再执行关机流程。

  • 立即关机:shutdown now
  • 延迟关机(如 10 分钟后):shutdown -h 10
  • 指定时间关机:shutdown -h 18:30
  • 取消已安排的关机:shutdown -c
  • 发送通知信息:shutdown -h 10 "System maintenance in progress"
  • 完成当前任务后关机:shutdown -h now或shutdown now,在任务执行完毕后立即关机;若需延时,可写成shutdown -h +5(5 分钟后关机)。

需要说明的是,shutdown -h now与shutdown now在多数发行版中等价,都会立即执行关机流程;而shutdown -h +5表示延迟 5 分钟后关机,适合在脚本中先完成清理任务再关机。若希望关机前先执行其他命令,可写成command && shutdown -h now,确保任务成功后才关机。

11. 总结

本文从 ls -l 输出出发,依次讲解了文件类型识别、权限字段解析、数字与符号权限表示、权限检查逻辑,再到 chmod、chown、chgrp、umask、特殊权限位等核心操作,最后补充了 file、sudo、shutdown 等实用命令。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询