> For the complete documentation index, see [llms.txt](https://book.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.bsdcn.org/man/man1/chmod.1.md).

# chmod.1

`chmod` — 更改文件模式

## 名称

`chmod`

## 概要

`chmod [-fhv] [-R [-H | -L | -P]] mode file`

## 描述

`chmod` 实用程序按照 `mode` 操作数的指定，修改所列文件的文件模式位。

选项如下：

**`-f`** 如果 `chmod` 无法修改 `file` 的模式，不显示诊断信息，也不修改退出状态以反映此类失败。

**`-H`** 如果指定了 `-R` 选项，命令行上的符号链接会被跟随，因此不受该命令影响。（遍历树时遇到的符号链接不会被跟随。）

**`-h`** 如果文件是符号链接，则更改链接本身的模式，而不是链接所指向的文件。

**`-L`** 如果指定了 `-R` 选项，所有符号链接都会被跟随。

**`-P`** 如果指定了 `-R` 选项，不跟随任何符号链接。这是默认行为。

**`-R`** 更改以各文件为根的文件层级的模式，而不仅仅是文件本身。注意，当使用形如“`.*`”的通配符时，要小心避免意外匹配到指向父目录的“`..`”硬链接。

**`-v`** 使 `chmod` 输出详细信息，在模式被修改时显示文件名。如果 `-v` 标志指定多次，还会以八进制和符号表示法打印文件的旧模式和新模式。

除非指定了 `-R` 选项，否则 `-H`、`-L` 和 `-P` 选项将被忽略。此外，这些选项会相互覆盖，命令的行为由最后指定的选项决定。

如果 `chmod` 收到 `SIGINFO` 信号（参见 stty(1) 的 `status` 参数），则会显示当前文件名以及旧的模式和新的模式。

只有文件的所有者或超级用户才有权更改文件的模式。

## 退出状态

`chmod` 实用程序成功时退出值为 0，发生错误时大于 0。

## 模式

模式可以是绝对模式或符号模式。绝对模式是一个八进制数，由以下一个或多个值之和构成：

**`4000`** （setuid 位）。设置了该位的可执行文件运行时，有效 uid 设置为文件所有者的 uid。如果底层文件系统支持此功能，设置了该位的目录会强制在其中创建的所有文件和子目录都归该目录所有者所有，而不是创建进程的 uid：参见 chmod(2) 和 [mount(8)](https://github.com/FreeBSD-Ask/freebsd-man-sc/blob/main/man8/mount.8.md) 的 `suiddir` 选项。

**`2000`** （setgid 位）。设置了该位的可执行文件运行时，有效 gid 设置为文件所有者的 gid。

**`1000`** （粘滞位）。参见 chmod(2) 和 [sticky(7)](https://github.com/FreeBSD-Ask/freebsd-man-sc/blob/main/man7/sticky.7.md)。

**`0400`** 允许所有者读取。

**`0200`** 允许所有者写入。

**`0100`** 对于文件，允许所有者执行。对于目录，允许所有者在目录中搜索。

**`0040`** 允许组成员读取。

**`0020`** 允许组成员写入。

**`0010`** 对于文件，允许组成员执行。对于目录，允许组成员在目录中搜索。

**`0004`** 允许其他人读取。

**`0002`** 允许其他人写入。

**`0001`** 对于文件，允许其他人执行。对于目录，允许其他人在目录中搜索。

例如，允许所有者读、写和执行，组成员读和执行，其他人读和执行，且无 set-uid 或 set-gid 行为的绝对模式为 755（400+200+100+040+010+004+001）。

符号模式由以下语法定义：

```sh
mode         ::= clause [, clause ...]
clause       ::= [who ...] [action ...] action
action       ::= op [perm ...]
who          ::= a | u | g | o
op           ::= + | - | =
perm         ::= r | s | t | w | x | X | u | g | o
```

`who` 符号“u”、“g”和“o”分别指定模式位的用户、组和其他部分。`who` 符号“a”等同于“ugo”。

`perm` 符号表示模式位的各部分，含义如下：

**r** 读取位。

**s** 执行时设置用户 ID 位和执行时设置组 ID 位。

**t** 粘滞位。

**w** 写入位。

**x** 执行/搜索位。

**X** 如果文件是目录，或者原始（未修改）模式中设置了任何执行/搜索位，则为执行/搜索位。使用 `perm` 符号“X”的操作仅在与 `op` 符号“+”配合时有意义，在所有其他情况下都被忽略。

**u** 文件原始模式中的用户权限位。

**g** 文件原始模式中的组权限位。

**o** 文件原始模式中的其他权限位。

`op` 符号表示执行的操作，含义如下：

**+** 如果未为 `perm` 提供值，“+”操作无效。如果未为 `who` 提供值，则设置 `perm` 中指定的、且文件模式创建掩码（参见 umask(2)）中对应位为清除状态的每个权限位。否则，设置由指定 `who` 和 `perm` 值所表示的模式位。

**-** 如果未为 `perm` 提供值，“-”操作无效。如果未为 `who` 提供值，则清除 `perm` 中指定的、且文件模式创建掩码中对应位为设置状态的每个权限位。否则，清除由指定 `who` 和 `perm` 值所表示的模式位。

**=** 由 `who` 值指定的模式位被清除；如果未指定 `who` 值，则所有者、组和其他模式位被清除。然后，如果未为 `who` 提供值，则设置 `perm` 中指定的、且文件模式创建掩码中对应位为清除状态的每个权限位。否则，设置由指定 `who` 和 `perm` 值所表示的模式位。

每个 `clause` 指定要对模式位执行的一个或多个操作，每个操作按指定顺序应用于模式位。

仅对其他权限（单独由符号“o”指定）进行操作，并与 `perm` 符号“s”或“t”组合时，将被忽略。

目录上的“w”权限将允许在该目录中创建、迁移和复制文件。在目录本身内创建的文件将继承其组 ID。

## 实例

**`644`** 使文件可被任何人读取，仅所有者可写。

**`go-w`** 拒绝向组和其他人授予写权限。

**`=rw,+X`** 将读和写权限设置为通常的默认值，但保留当前已设置的任何执行权限。

**`+X`** 如果目录或文件已可被任何人搜索/执行，则使其可被所有人搜索/执行。

**`755`**

**`u=rwx,go=rx`**

**`u=rwx,go=u-w`** 使文件可被所有人读取/执行，仅所有者可写。

**`go=`** 清除组和其他人的所有模式位。

**`g=u-w`** 将组位设置为与用户位相同，但清除组的写位。

## 兼容性

`-v` 选项是非标准的，不建议在脚本中使用。

## 参见

chflags(1), install(1), setfacl(1), chmod(2), stat(2), umask(2), fts(3), setmode(3), [sticky(7)](https://github.com/FreeBSD-Ask/freebsd-man-sc/blob/main/man7/sticky.7.md), symlink(7), [chown(8)](/man/man8/chown.8.md), [mount(8)](https://github.com/FreeBSD-Ask/freebsd-man-sc/blob/main/man8/mount.8.md)

## 标准

`chmod` 实用程序预期与 IEEE Std 1003.2 ("POSIX.2") 兼容，但 `perm` 符号“t”例外，该符号未包含在该标准中。

## 历史

`chmod` 命令首次出现于 Version 1 AT\&T UNIX。

## 缺陷

对于马的“调皮位”（naughty bits），没有对应的 `perm` 选项。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://book.bsdcn.org/man/man1/chmod.1.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
