Linux/Unix 中 chmod 命令及其示例

17 Mar 2025 | 6 分钟阅读

Linux chmod 命令用于更改文件和目录的访问权限。它代表change mode(更改模式)。它不能更改符号链接的权限。即使在递归目录遍历中遇到符号链接,它也会忽略它们。

Linux 文件系统中,每个文件都与特定的所有者关联,并具有不同用户的权限访问。用户类别可以是

  • 所有者
  • 组成员
  • 其他(所有人)

Linux 中的文件权限是以下三种类型

  • 读取 (r)
  • 写入 (w)
  • 执行 (x)

Chmod 的简要历史

首先,chmod 命令出现在 AT&T UNIX 第 1 版中,具有 chmod 系统调用。除了这些最常见的模式之外,访问控制列表还被包含在几个文件系统中,以增强灵活性,因为系统的类型和用户数量都在增长。

GNU coreutils 中提供的 chmod 版本由 Jim Meyering 和 David MacKenzie 指定。该命令作为 Microsoft Windows 的一个独立包提供,是 UnxUtils 原生 Win32 端口集合的基本 GNU 类 Unix 工具的一部分。此外,chmod 命令已交付给 IBM i 操作系统。

让我们看看如何使用 chmod 命令更改文件权限。

语法

chmod 命令的基本语法如下

通常实现的选项有

  • -R:代表递归,即添加到子目录中的对象。
  • -V:代表详细,显示修改的对象(未修改的对象不显示)。

如果提到了符号链接,则会影响目标对象。通常不使用与符号链接本身直接相关的文件模式。

chmod 权限的主要组成部分

例如,rwxr-x---

每三个字符一组,指定所有类别的权限

  • rwx:最左边的三个字符指定文件所有者(即用户类别)的权限。
  • r-x:中间三个字符指定文件所属组(即组类别)的权限。
  • ---:最右边的三个字符指定其他类别(Other class)的权限。非文件所有者和组成员的用户无法访问文件。

选项

chmod 命令支持以下命令行选项

-c, --changes:与 verbose 选项类似,但区别在于它会报告是否已进行更改。

-f, --silent, --quiet:用于抑制错误消息。

-v, --verbose:用于显示每个已处理文件的诊断信息。

--no-preserve-root:用于不处理反斜杠符号 ('/'),尤其是(默认)。

--preserve-root:如果使用此选项,它将无法对反斜杠 ('/') 执行递归操作。

--reference=RFILE:用于指定 RFILE 的模式,而不是 MODE 值。

-R, --recursive:用于递归更改文件和目录。

--help:用于显示帮助手册,其中包含用法和支持选项的简要说明。

--version:用于显示版本信息。

文件权限语法

如果您是新用户,您可能会对用于设置文件权限的不同类型的字母感到困惑。因此,在继续使用 chmod 命令之前,让我们先了解文件权限语法。

要设置文件或目录的权限,我们需要指定以下内容

  • 谁:我们是谁。(用户)
  • 什么:我们要进行什么更改(例如,添加或删除权限)?
  • 哪个:哪些权限?

权限语句用指示符表示,例如 u+x, u-x。其中 'u' 代表 'user'(用户),'+' 代表添加,'-' 代表删除,'x' 代表可执行(which)。

用户值可以是

u:文件的所有者

g:组成员

o:其他人

a:所有人

权限类型可以是 r、w 和 x。

设置和更新权限

要设置文件权限,请使用 chmod 命令执行权限语句。例如,我们要为文件“Demo.txt”的所有用户和组设置读写权限。我们必须使用“u=rw,go=rw Demo.txt”权限语句与 chmod 命令一起传递。要显示文件权限,请执行以下命令

上述命令将显示“Demo.txt”文件的当前文件权限。

要更改权限,请执行以下命令

考虑下面的输出

Linux chmod Command

从上面的输出中,“Demo.txt”的访问权限已更改。

为多个文件设置权限

我们可以使用 chmod 命令一次为多个文件设置权限。要更改多个文件的文件权限,请使用 chmod 命令指定文件模式。例如,如果我们想为所有文本文件设置读写权限,请使用 chmod 命令指定 *.txt 模式。

要查看当前工作目录中所有文本文件的权限,请执行以下命令

它将列出所有文本文件及其权限模式。请看下面的输出

Linux chmod Command

从上面的输出中,许多文件只对其他用户具有读取权限。

要为其他用户设置读写权限,请执行以下命令

它将为文本文件的其他用户设置读写权限。请看下面的输出

Linux chmod Command

数字简写

我们可以使用数字值而不是字母来指定权限。使用三位数字值来指定权限。最左边的数字代表所有者 (u),中间的数字代表组成员 (g)。最右边的数字代表其他人 (o)。

下表表示数字及其权限

数字权限
000无权限
001执行权限
010写入权限
011写入和执行权限
100读取权限
101读取和执行权限
110读取和写入权限
111读取、写入和执行权限

符号模式

此外,chmod 命令接受更精细的符号表示法,允许更改特定模式。符号模式由三个元素组成,它们合并成一个单一的文本字符串

chmod 程序使用一个运算符来定义文件模式的排列方式。以下运算符是允许的

运算符描述
+它将描述的内容添加到描述的类别中。
-它将描述的模式从描述的类别中删除。
=它表示描述的模式将为描述的类别创建相同的模式。

模式表示要从描述的类别中删除或授予哪些权限。主要有三种常见模式与通用权限相关

名称众数描述
读取r它读取文件或列出目录的内容。
writew它写入目录或文件。
executex它遍历目录树或执行文件。
特殊执行X它不是权限,而是可以用来代替 x。它使用目录的执行权限,而不考虑其当前权限,并使用至少设置了执行权限位的文件的执行权限。如果与“+”运算符一起使用并且未设置执行权限(如果仅使用 chmod -R a+rx .),则很有用,而我们可以实现 chmod -R a+rx . 使用 x 代替。

可以通过用逗号分隔多个符号模式来描述多个修改。如果用户未指定,chmod 命令将检查umask

特殊模式

此外,chmod 命令还可以更改目录或文件的特殊模式和额外权限。符号模式应用“s”来表示 setgid 和 setuid 模式,应用“t”来表示 sticky 模式。模式仅用于正确的类别,尽管是否提及其他类别。

几乎所有操作系统都以数字方式支持特殊模式规范,尤其是在八进制中,但有些不支持。只有符号模式可以应用于这些系统。

一些命令行示例

命令描述
chmod a+r publicComments.txt它将为所有类别(即组、所有者和其他)添加读取权限。
chmod a-x publicComments.txt它将删除所有类别的执行权限。
chmod a+rx viewer.sh它将为所有类别添加执行和读取权限。
chmod u=rw, g=r, o=internalPlan.txt它将为用户设置读写权限,为组设置读取权限,并拒绝其他人的访问。
chmod -R u+w, go-w docs它将为所有者添加写入权限到目录 docs 及其所有内容,并删除其他人或组的写入权限。
chmod ug=rw groupAgreements.txt它将为组和用户设置读写权限。
chmod 664 global.txt它将为组和用户设置读写权限,并为其他人提供读取权限。
chmod 744 Show_myCV.sh它将为用户设置执行、写入和读取权限,并为组和其他人提供读取权限。

下一主题Linux chown 命令