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 值 | 新建文件权限 | 新建目录权限 | 适用场景 |
|---|---|---|---|
| 022 | 644 | 755 | 常见默认值,属组和其他用户可读 |
| 002 | 664 | 775 | 团队协作,属组可读写 |
| 077 | 600 | 700 | 高安全,仅属主可访问 |
| 027 | 640 | 750 | 属组可读写,其他用户无权限 |
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 bit8. 识别文件类型: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 等实用命令。