---
url: https://eoht.net/fe/linux/file-permission.md
description: >-
  系统介绍 Linux 文件与目录权限模型，解释文件类型、所有者、用户组、其他用户以及 r、w、x 在文件和目录上的不同含义，说明权限判定顺序和 root
  账户的限制，并演示使用 chmod 的符号模式与数字模式修改权限、用 chown 更改所有者或用户组，结合 744、765 等示例拆解权限数值和实际效果。
---

# Linux 文件权限：rwx、chmod、chown 与数字权限 {#linux-file-permissions-guide}

## Linux 的文件权限 {#understand-linux-file-permissions}

Linux 的基本文件权限按所有者、所属组和其他用户三类划分。权限由进程的有效身份及所属组参与判定，不是只看当前终端显示的用户名；ACL、挂载选项和安全模块还可能施加额外限制。

`ls -l` 通常用第一个字符表示文件类型，后续九个字符表示三组基本权限；末尾可能还有 ACL 等附加标记。以下分别说明：

### 表示文件的类型 {#linux-file-types}

|     |                                  |
| --- | -------------------------------- |
| `-` | 普通文件                   |
| `d` | 目录                   |
| `l` | 符号链接，指向另一路径 |

### 用户组类型 {#linux-user-group-types}

| 缩写 | 用户组  | 类型                               |
| ---- | ------- | ---------------------------------- |
| `u`  | `owner` | 文件所有者适用的权限 |
| `g`  | `group` | 属于文件所属组的用户适用的权限 |
| `o`  | `other` | 不属于前两类的用户适用的权限   |

### 权限 {#linux-permission-bits}

* `r`：`Read` 读
* `w`：`Write` 写
* `x`：`execute` 执行

文件只在需要直接执行时添加执行权限，二进制程序和带解释器声明的脚本都可能需要 `x`。例如运行 `./script.sh` 要求执行权限；运行 `sh script.sh` 则由 Shell 读取脚本，通常要求读取权限。目录的 `x` 表示搜索或穿越权限。

针对文件和目录来说，`r`、`w`、`x` 有不同的作用：

| 权限 | 普通文件 | 目录 |
| --- | --- | --- |
| `r` | 读取内容 | 列出目录中的文件名 |
| `w` | 修改内容 | 配合目录的 `x` 创建、删除或重命名目录项，还可能受 sticky bit 限制 |
| `x` | 尝试将文件作为程序执行 | 穿越目录或访问已知名称的目录项，文件内容还需相应文件权限 |

因此，删除文件主要取决于父目录的权限，不等同于文件本身是否可写。

:::tip
root 通常有绕过基本读写权限的能力，但并非可以绕过所有限制，例如只读挂载、安全模块或网络文件系统的服务端权限。Linux 上直接执行普通文件通常仍要求至少一个执行位已设置；通过解释器读取脚本属于另一条操作路径。
:::

<table>
  <caption>权限分配</caption>
  <colgroup span="2"></colgroup>
  <colgroup span="3"></colgroup>
  <colgroup span="3"></colgroup>
  <colgroup span="3"></colgroup>
  <thead>
    <tr>
      <th scope="col" rowspan="2">权限项</th>
      <th scope="col" rowspan="2">文件类型</th>
      <th scope="colgroup" colspan="3">文件所有者</th>
      <th scope="colgroup" colspan="3">文件所属组用户</th>
      <th scope="colgroup" colspan="3">其他用户</th>
    </tr>
    <tr>
      <th scope="col">读</th>
      <th scope="col">写</th>
      <th scope="col">执行</th>
      <th scope="col">读</th>
      <th scope="col">写</th>
      <th scope="col">执行</th>
      <th scope="col">读</th>
      <th scope="col">写</th>
      <th scope="col">执行</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">字符表示</th>
      <td>(d|l|c|s|p)</td>
      <td>（r）</td>
      <td>（w）</td>
      <td>(x)</td>
      <td>(r)</td>
      <td>(w)</td>
      <td>(x)</td>
      <td>(r)</td>
      <td>(w)</td>
      <td>(x)</td>
    </tr>
    <tr>
      <th scope="row">数字表示</th>
      <td></td>
      <td>4</td>
      <td>2</td>
      <td>1</td>
      <td>4</td>
      <td>2</td>
      <td>1</td>
      <td>4</td>
      <td>2</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

仅考虑基本 rwx 位时：进程身份匹配文件所有者就使用 owner 这一组；否则若属于文件的所属组（包括附加组）就使用 group；其余使用 other。匹配到一类后，不会因为该类权限不足而继续从 other 借用权限；存在 ACL 时还要结合 ACL 判定。

## 修改文件权限 {#change-linux-file-permissions}

`chmod` 修改权限位，`chown` 修改所有者或所属组。两者不能相互替代。

| 命令 | 作用与权限要求 |
| --- | --- |
| `chmod` | 修改权限，通常要求是文件所有者或具有相应特权 |
| `chown` | 更改所有者通常需要管理员权限；所有者仅在允许范围内更改所属组 |

例如，将文件交给指定用户和组前，先确认这两个身份存在：

```sh
ls -l example.txt
id alice
getent group developers
sudo chown alice:developers example.txt
ls -l example.txt
```

`alice`、`developers` 和文件名是示例，需替换；不要在不清楚目录内容时直接递归修改系统目录。

## mode 方式 {#symbolic-permission-mode}

```text
chmod [ugoa][+-=][rwxX] 文件
```

|       |                                                                                   |
| ----- | --------------------------------------------------------------------------------- |
| `who` | `u` 所有者、`g` 所属组、`o` 其他用户、`a` 三类全部 |
| `opt` | `+` 添加某个权限 `-` 取消某个权限 `=` 赋予权限                                    |
| `per` | `r w x X`                                                                         |

示例：

```bash
chmod u+x script.sh          # 只给所有者增加执行权限
chmod go-w example.txt      # 去掉组和其他用户的写权限
chmod u=rw,go=r example.txt # 明确设置为 rw-r--r--
```

`+` 增加、`-` 移除、`=` 指定所选类别的权限。省略 `u/g/o/a` 时会受 umask 影响；需要明确操作全部类别时写 `a`。大写 `X` 只在目录或已有任一执行位的文件上设置执行权限，常用于区分目录与普通数据文件。

## 数字方式设置权限 {#numeric-permission-mode}

### 命令语法 {#chmod-command-syntax}

使用数字方式修改文件权限的基本语法如下：

```sh
chmod 640 example.txt
```

三位八进制数字依次表示所有者、所属组、其他用户；每一位由读 4、写 2、执行 1 相加。这里的 640 是所有者可读写、组只读、其他用户无权限；不是给原权限逐项累加。

### 权限对应关系表 {#linux-permission-value-table}

| 权限  | 数字值 | 权限总和 |
| ----- | ------ | -------- |
| `rwx` | `4+2+1` | `7`      |
| `rw-` | `4+2+0` | `6`      |
| `r--` | `4+0+0` | `4`      |

> * `0` 表示无权限
> * `1` 表示执行权限（`x`）
> * `2` 表示写权限（`w`）
> * `4` 表示读权限（`r`）

### 权限示例 {#linux-permission-examples}

以下是说明权限拆解的示意输出，不是需要执行的命令：

```text
-rwxr--r-- 1 alice developers 10 Oct 16 02:55 script.sh
```

| 权限类别     | 权限字符串 | 数值拆解 | 权限总和 |
| ------------ | ---------- | -------- | -------- |
| 用户权限     | `rwx`      | `4+2+1`  | `7`      |
| 用户组权限   | `r--`      | `4+0+0`  | `4`      |
| 其他用户权限 | `r--`      | `4+0+0`  | `4`      |

### 权限组合示例：`744` {#chmod-744-example}

代表用户拥有读、写、执行权限，组和其他用户只有读权限。

## 修改权限示例 {#chmod-usage-example}

先用 `ls -l` 查看现状，再选择符号方式增减特定位，或用数字方式直接设定完整权限。示例不意味着所有文件都应该开放给其他用户执行。

### 权限组合结果：`765` {#chmod-765-result}

```sh
chmod 765 script.sh
ls -l script.sh
```

结果为 `rwxrw-r-x`：所有者 7、组 6、其他用户 5。从 744 变为 765，是给组增加写权限、给其他用户增加执行权限，所有者权限不变。实际程序、数据文件与目录应按用途选择权限，不需要统一设置为 765。

## Linux 学习路径 {#linux-learning-path}

权限操作会直接影响文件命令的结果，可先对照 [Linux 文件操作](/fe/linux/file)；继续排查程序与资源占用时，可阅读 [Linux 进程管理](/fe/linux/process)。
