权限位
在 Linux 中,权限位是一种用于控制用户对文件或目录的访问权限的机制。每个文件或目录都有三组权限位,分别对应于文件所有者、文件所属组和其他用户。
权限位的权限值可以通过 ls -l 命令来查看。例如,以下命令将显示 /etc/passwd 文件的权限位:
ls -l /etc/passwd文件/目录权限字符串的最大位数是 10 位,1 个标识位和 9 个权限位。如:drwxr-x---,查看的时候可以这样看:[d][rwx][r-x][---]
| 位置位数 | 含义 | 说明 |
|---|---|---|
| 第 1 位 | 文件类型 | - = 普通文件、d = 目录、l = 软链接等 |
| 第 2 ~ 4 位 | 所有者(owner)权限 | r = 读、w = 写、x = 执行,无则为 - |
| 第 2 ~ 4 位 | 所属组(group)权限 | 同上 |
| 第 8 ~ 10 位 | 其他用户(others)权限 | 同上 |
每个权限位都有一个对应的数字值,分别为 4、2、1
| 权限字符 | 含义 | 数字 |
|---|---|---|
| r | 读取 | 4 |
| w | 写入 | 2 |
| x | 运行 | 1 |
| - | 无权限 | 0 |
这三个数字的和就是该组权限位的权限值
目录 vs 文件的 “执行权限” 差异(关键):
- 目录的 x 权限:允许 cd 进入目录、ls 查看目录内文件(即使有 r 权限,无 x 也无法 ls)
- 文件的 x 权限:允许执行(如脚本、二进制程序)(普通文件无需 x,除非是可执行程序)
八进制表示法
格式:3 位数字(u、g、o 各 1 位),范围 000~777
| 数字 | 符号权限 | 含义 |
|---|---|---|
| 770 | rwxrwx--- | 所有者 + 同组可读 / 写 / 执行 |
| 755 | rwxr-xr-x | 所有者全权限,组 / 其他读 + 执行(无写) |
| 700 | rwx------ | 仅所有者可读 / 写 / 执行 |
| 644 | rw-r--r-- | 所有者读 + 写,组 / 其他仅读 |
| 600 | rw------- | 仅所有者读 + 写(无执行) |
符号表示法
格式:[角色][操作符][权限],适合仅修改某一位权限
角色:u(所有者)、g(所属组)、o(其他)、a(所有角色,=ugo)
操作符:+(添加)、-(移除)、=(覆盖设置)
权限:r(读取)、w(写入)、x(执行)
| 符号 | 符号权限 | 含义 |
|---|---|---|
| ug+rwx,o=rwx | rwxrwx--- | 所有者 + 同组可读 / 写 / 执行 |
| u=rwx,go=rx | rwxr-xr-x | 所有者全权限,组 / 其他读 + 执行(无写) |
| u=rwx,go-rwx | rwx------ | 仅所有者可读 / 写 / 执行 |
| u=rw,go=r | rw-r--r-- | 所有者读 + 写,组 / 其他仅读 |
| u=rw,go-rwx | rw------- | 仅所有者读 + 写(无执行) |
对于去除权限,也可以写为
xx=---表示将 xx 角色的权限设置为无权限,等价于chmod xx-rwx
特殊权限(SUID、SGID、Sticky Bit)
基础的 u/g/o 权限解决不了所有场景(比如普通用户改密码需要改 root 所属的 /etc/shadow 文件),就需要这三个特殊权限来解决这类问题,它们对应八进制的第四位(基础权限是后三位,比如 755 加特殊权限就是 4755、2755、1777)
| 特殊权限 | 八进制值 | 符号表示 | 作用 |
|---|---|---|---|
| SUID(Set UID) | 4 | u+s | 执行文件时,以 “文件所有者” 身份运行(而非执行用户) |
| SGID(Set GID) | 2 | g+s | 执行文件:以文件所属组身份运行;目录:新建文件继承目录的所属组 |
| Sticky Bit(粘滞位) | 1 | o+t | 目录内,仅文件所有者 /root 能删除该文件(防误删) |
SUID
通俗来讲,SUID 权限就像一个“特殊的执行权限”,当文件设置了 SUID 权限后,无论谁执行这个文件,它都会以文件所有者的身份运行,而不是执行用户的身份
root@XMLN:~# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 2月 6 2024 /usr/bin/passwd以上的u权限位中最后的一位不是x,而是s,这是为了标识这是一个设置了SUID权限的文件
# 加 SUID(八进制方式:4+基础权限)
chmod 4755 /usr/bin/mycommand
# 或符号方式
chmod u+s /usr/bin/mycommand
# 删 SUID
chmod u-s /usr/bin/mycommand注意:如果给 /bin/bash 加 SUID,普通用户执行 bash 会直接变成 root,极度危险!系统里只有 passwd、su、sudo 等核心命令会默认加 SUID
SGID
SGID 有两个作用:
- 对目录:给目录加 SGID 后,目录内新建的所有文件 / 子目录,都会继承这个目录的所属组(而不是创建者的默认组)(核心用途)
- 对可执行文件:执行时临时拥有文件所属组的权限(几乎不用)
- 加了 SGID 的目录,权限字符串中 “所属组的 x 位” 会变成 s
Sticky Bit
给目录加粘滞位,就像“给目录里的每个文件上了防删锁”就算目录权限是 777(所有人可读写),也只有文件所有者或 root 能删除/重命名这个文件,其他人就算有写权限也删不了
仅对目录有效(给文件加没用);加了粘滞位的目录,权限字符串中 “其他用户的 x 位” 会变成 t
umask(权限掩码)
umask 是一个系统级别的环境变量,用于设置新创建文件 / 目录的默认权限掩码
| 类型 | 最大默认权限 | 原因 |
|---|---|---|
| 目录 | 777(rwxrwxrwx) | 目录需要 x(执行)权限才能 cd 进入、ls 查看内容,所以最大开放所有权限 |
| 普通文件 | 666(rw-rw-rw-) | 系统默认不给文件 x(执行)权限(安全!防止新建的文本文件被误执行) |
umask 规定了 “哪些权限要被默认减掉”,最终看到的新建 文件/目录权限 = 最大权限 - umask 值
计算规则:umask 是 3 位数字(比如 022、002、007),每一位对应 u(所有者)、g(所属组)、o(其他),计算时每一位分别相减
例子:
umask 022:
- 所有者权限:777 - 022 = 755(rwxr-xr-x)
- 所属组权限:777 - 022 = 755(rwxr-xr-x)
- 其他权限:666 - 022 = 644(rw-r--r--)
操作
查看当前 umask:umask(普通用户输出 0002,root 输出 0022)
临时修改(仅当前终端会话有效):umask 007
永久修改:
# 普通用户(仅自己生效)
echo "umask 007" >> ~/.bashrc # 写入配置文件
source ~/.bashrc # 立即生效
# 全局生效(所有用户)
echo "umask 022" >> /etc/profile
source /etc/profile修改所有者/所属组(chown)
命令:
chown [选项] [所有者][:所属组] 目标文件/目录| 选项 | 作用 | 场景 |
|---|---|---|
-R | 递归处理子目录 / 文件 | 目录权限配置必用 |
-v | 显示详细的操作信息 | 排查权限修改是否生效 |
-c | 仅显示实际被修改的文件(区别于 -v:-v 显示所有,-c 仅显示变更项) | 批量修改时减少冗余输出 |
-h | 仅修改符号链接本身的权限,不跟随链接修改原文件 | 避免误改软链接指向的核心文件 |
--reference=参考文件 | 以参考文件的所有者/所属组为标准,修改目标文件/目录的所有者/所属组 | 批量统一权限 |
对于 [所有者][:所属组] 来说,所有者和所属组可以同时指定,也可以只指定其中一个。如果只指定所有者,那么所属组将保持不变;如果只指定所属组,那么所有者将保持不变。
执行权限要求
普通用户:仅能修改自己拥有的文件的所属组(且组需是自己所属的组)
root 用户:无限制,可修改任何文件的所有者 / 所属组
chgrp 修改所属组
chgrp 是仅修改所属组的命令,等价于 chown :组名 目录/目标文件
命令:
chgrp [选项(参考chown选项)] 所属组 目标文件/目录修改权限(chmod)
命令:
chmod [选项] [权限表示法] 目标文件/目录例子(8 进制表示法):
chmod -R 755 /目录1/目录2/
chmod 644 /目录/文件例子(符号表示法):
chmod -R ugo+rwx /目录1/目录2/
chmod u+rwx,go-rwx /目录/文件