Linux 中的 chmod 命令及示例

chmod 命令控制谁可以在 Linux 系统上读取、写入和执行文件。无论您是要强化 SSH 密钥、部署 Web 应用程序还是管理团队项目,这都是一项关键技能。错误配置的权限可能会暴露敏感数据或阻止合法用户,因此了解如何读取权限字符串、应用数字和符号模式以及避免 chmod 777 等常见陷阱可以节省时间和安全问题。

本指南向您展示如何检查现有权限、使用数字和符号表示法应用更改、安全处理递归目录更新、使用特殊权限位(setuid、setgid、sticky)以及解决从共享 Web 服务器到 SSH 配置等实际环境中的访问问题。

如果您不熟悉 chmod,请将其视为权限交换机,告诉 Linux 谁可以读取、修改或运行您的文件。正确更新这些开关可以保持敏感数据的私密性,同时为团队成员提供他们所需的访问权限。

chmod 实用程序作为 GNU coreutils 的一部分随每个 Linux 发行版一起提供,因此可以在裸节点、容器映像和桌面系统等上使用。

什么是 chmod 命令?

chmod 更新附加到文件和目录的模式位。这些位描述了授予所有者、所属组和其他所有人的读、写和执行权限。通过调整模式,您可以决定脚本是否可以运行、日志文件是否保持写保护或共享文件夹是否继承组访问权限。

为什么使用 chmod 命令?

每个部署工作流程,从移交备份到发布 Web 内容,都依赖于正确的权限。 chmod 提供您所需的快速调整:使脚本可执行、锁定 SSH 密钥或授予项目组写入权限,而不会将数据暴露给系统上的每个人。

chmod 命令语法的工作原理

使用以下形式的命令:

chmod [OPTIONS] MODE[,MODE]... FILE...
  • chmod:将新的权限位写入磁盘的命令。
  • [选项]: 标志如-R或者--reference=RFILE修改更改的应用方式。
  • 模式[,模式]...:您要申请的权限。使用数值,例如755完全所有者控制,或象征性更改,例如u+x添加执行权限。
  • 文件…:将接收更新模式的一个或多个文件或目录。

最简单的是,运行chmod 644 example.txt授予所有者读写访问权限,而其他人则获得只读访问权限。当您想要调整部分模式时,请切换到符号模式。例如,chmod g+w shared.log让您的群组更新共享日志,而无需触及所有者或其他权限。

使用此快速参考为常见权限任务选择正确的选项:

任务选项他们做什么
从已知良好的文件复制权限--reference=RFILE应用参考中的确切模式,以便相关文件保持对齐。
安全地更改整个项目树-R通过目录递归;与符号模式配对,例如u=rwX,go=rX以避免将数据文件标记为可执行。
减少自动化脚本中的噪音-f/--quiet抑制大多数错误消息,使 CI 日志专注于实际问题。
审核故障排除期间发生的变化-v/--changes为每个权限已更新的文件打印一行,以便您可以确认范围。
在递归运行期间保护根目录--preserve-root防止意外模式更改/使用时-R来自升高的外壳。

chmod 提供数字和符号表示法。数字模式可一步替换整个权限集,而符号模式可让您添加、删除或复制特定位,而无需触及其余部分。

Linux 文件权限如何使用 chmod

如果您不熟悉 Linux 权限,请将它们视为控制谁可以对您的文件执行哪些操作的安全门。每个文件和目录都具有分配给三个用户类别(所有者、组、其他)的三种权限类型(读、写、执行)。了解如何查看和修改这些权限对于安全管理文件访问至关重要。

查看当前权限

在更改权限之前,请使用以下命令检查当前设置的内容ls -l命令:

ls -l filename

这显示输出如下:

-rw-r--r-- 1 user group 1024 Oct 29 10:30 filename

分解权限字符串-rw-r--r--:

  • 第一个字符(-:文件类型(-对于文件,d对于目录,l用于符号链接)
  • 字符 2-4 (rw-:所有者权限(读、写、不可执行)
  • 字符 5-7 (r--:组权限(只读)
  • 字符 8-10 (r--:其他权限(只读)

三种权限类型

权限三元组中的每个位置代表一个特定的访问级别:

  • r(读):查看文件内容或列出目录内容
  • w(写):修改、删除、重命名文件;创建或删除目录中的文件
  • x(执行):将文件作为程序运行;进入(cd 到)目录

目录需要执行权限才能访问其内容。即使您有读取权限,也无法列出没有执行权限的文件。

chmod 中的数字和符号模式

chmod 提供两种设置权限的方法:数字(八进制)模式和符号模式。每个服务于不同的用例。数字模式可以快速设置绝对权限,而符号模式可以添加或删除特定权限而不影响其他权限。

使用数字(八进制)模式获得确切的权限

数字模式使用三位数,其中每个数字分别代表所有者、组和其他人的权限。每种权限类型都有一个转换为十进制数的二进制值:

  • 读(r)= 4(二进制 100)
  • 写(w)= 2(二进制 010)
  • 执行(x)= 1(二进制 001)
  • 没有许可= 0(二进制 000)

要计算权限数字,请添加所需权限的值。例如:

  • 7= 读 + 写 + 执行 (4+2+1) = rwx
  • 6= 读 + 写 (4+2) = rw-
  • 5= 读取 + 执行 (4+1) = 接收
  • 4= 只读 (4) = r–
  • 3= 写入 + 执行 (2+1) = -wx
  • 2= 只写 (2) = -w-
  • 1= 仅执行 (1) = –x
  • 0= 无权限 (0) = —

当您使用 chmod 755 时,您将设置三个单独的权限集:7 表示所有者 (rwx),5 表示组 (rx),5 表示其他人 (rx)。此数字速记会将所有现有权限替换为您指定的值。

chmod 755 filename  # Owner: rwx, Group: r-x, Others: r-x

使用符号模式调整权限

符号模式使用字母和运算符来修改权限,而无需替换整个权限集。这种方法对于进行增量更改更加直观。

谁(用户类别):

  • = 用户(所有者)
  • = 组
  • =其他人
  • 一个=全部(相当于ugo)

什么(运营商):

  • += 添加权限
  • = 删除权限
  • == 设置确切的权限(删除其他权限)

其中(权限类型):

  • r= 读
  • w= 写
  • x= 执行

符号模式允许您向所有者添加执行权限,而无需触及其他权限:

chmod u+x filename  # Add execute for owner only

当您想要一次设置所有权限时使用数字模式 (chmod 644),而当您需要修改特定权限时使用符号模式 (chmod g+w)。

常见 chmod 命令示例

了解权限和 chmod 命令的工作原理后,让我们探讨一些实际示例。

示例 1:使用数字模式更改权限

chmod 755 filename

此命令更改“文件名”的权限,以便:

  • 用户(所有者)拥有读取 (4)、写入 (2) 和执行 (1) 权限 – 总计 7 个。
  • 该组和其他人有读(4)和执行(1)权限,共5个。

换句话说,所有者拥有完全访问权限,而组成员和其他人可以读取和执行该文件,但不能修改它。

示例 2:使用符号模式更改权限

chmod u+x filename

此命令将用户的执行权限添加到“filename”。详细情况如下:

  • u:代表用户。
  • +:表示正在添加权限。
  • x:代表执行权限。

总而言之,该命令告诉系统:“为用户(u)添加(+)执行(x)此文件('文件名')的权限”。

示例 3:删除权限

chmod go-w filename

此命令从“文件名”中删除组和其他人的写入权限:

  • go:代表团体和其他。
  • -:表示正在删除某个权限。
  • w:代表写权限。

此命令删除组和其他用户的写入权限,从而增强文件的安全性。

示例4:设置所有权限

chmod ugo+rwx filename

此命令向所有用户授予“文件名”的所有权限。详细情况如下:

  • ugo:代表用户、组和其他。
  • +:表示正在添加权限。
  • rwx:代表读、写、执行权限。

该命令有效地向所有人开放“文件名”。请谨慎使用此选项,并考虑使文件全局可写和可执行的安全影响。

示例 5:使用带有 -R 选项的 chmod

chmod -R u=rwX,go=rX directoryname

此命令递归地更改“directoryname”和所有嵌套内容的权限。首都X仅向已可执行的目录和文件添加执行权限,防止常规数据文件意外变为可执行,同时确保目录保持可遍历性。

  • -R:将规则应用于目录本身及其下的所有内容。
  • u=rwX:授予所有者读/写访问权限,并且仅将执行添加到已经可执行的目录或文件。
  • go=rX:授予组和其他人读取访问权限以及目录遍历,而无需将常规文件转换为可执行文件。

使用这种更安全的图案代替毯子chmod -R 755,这可能会无意中将每个文件标记为可执行文件。

示例 6:更改组权限

chmod g-wx filename

此命令从“filename”组中删除写入和执行权限:

  • g:代表组。
  • -:表示正在删除权限。
  • wx:代表写入和执行权限。

与“文件名”关联的组成员将无法再修改或执行它。

示例 7:更改多个权限

chmod u=rwx,g=rx,o=r filename

该命令为不同类型的用户设置不同的权限:

  • u=rwx:设置用户的读、写、执行权限。
  • g=rx:设置组的读取和执行权限。
  • o=r:设置对方的权限为只读。

这使您可以精细地控制不同类型用户的访问级别。

示例 8:复制权限

chmod --reference=filename1 filename2

此命令将权限从“filename1”复制到“filename2”。

  • –reference=filename1:指示“filename1”是从中复制权限的参考文件。

当您想要快速对多个文件应用相同的权限时,此命令非常方便。

示例 9:使用粘性位更改权限

chmod 1777 directoryname

此命令设置粘滞位 (1) 并对“directoryname”应用 777 权限。

  • 粘滞位 (1) 确保只有文件所有者、目录所有者或 root 用户可以删除或重命名目录内的文件。
  • 777:为每个人提供读、写和执行访问权限,以便用户可以创建和管理自己的文件,而粘滞位则阻止他们删除不属于自己的文件。

这是用于共享可写目录的模式,例如/tmp、草稿区域或上传每个用户都需要写入权限的文件夹,而无需担心删除其他人的工作。

示例 10:将 chmod 与 Find 命令结合使用

find /path -type f -exec chmod 644 {} \;

该命令查找下面的所有常规文件/path及其子目录,并将其权限更改为 644(所有者读/写,组和其他人读)。

  • find /path -type f:查找给定路径下的所有文件。
  • -exec chmod 644 {} \;:更改找到的每个文件的权限。

当您想要根据特定条件更改多个文件的权限时,此命令非常有用。有关使用 find 和 -exec 的更多详细信息,请参阅我们的。

高级 chmod 命令示例

chmod 有一些技巧可以让你的生活变得更加轻松。让我们探讨一下这些高级示例。

高级示例1:镜像所有者对组的权限

chmod -R g=u /srv/team-project

符号副本允许您重用现有权限集,而不是重新计算数值:

  • g=u:将所有者的权限复制到每个文件的组,匹配已存在的任何读取、写入或执行位。
  • -R:通过项目树传播更改,以便嵌套文件和目录继承镜像位。
  • 将个人工作区迁移到共享目录后使用此功能,以便团队成员获得相同的访问权限,而无需向其他用户打开内容。

高级示例 2:设置 Setuid、Setgid 和粘性位

chmod 4755 /usr/bin/passwd
chmod 2775 /srv/team-project
chmod 1777 /srv/shared/tmp

这些命令设置文件或目录的 setuid、setgid 和粘性位:

  • setuid 位 (4):在文件上设置后,用户可以使用文件所有者的权限执行该文件。
  • setgid 位 (2):在目录上设置时,新文件和子目录将继承其组,这使协作者与相同的组权限保持一致。
  • 粘性位 (1):保护目录内的文件不被其他用户删除。将其与 setgid 结合使用(例如,chmod 3775 /srv/shared/tmp) 当您同时需要共享组所有权和删除保护时;使用普通的1777对于世界可写的暂存空间,例如/tmp

高级示例3:仅更改目录的权限

find /path -type d -exec chmod 755 {} \;

此命令仅更改给定路径下目录的权限,使文件保持原样:

  • find /path -type d:查找给定路径下的所有目录。
  • -exec chmod 755 {} \;:更改找到的每个目录的权限。

当您只想更改目录而不是文件的权限时,此命令非常有用。

高级示例 4:使用 find 定位特定文件

find /srv/shared -type f -name "*.sh" -exec chmod 750 {} +

此模式缩小了对实际需要新权限的文件的递归更改范围:

  • -type f-name "*.sh":只匹配shell脚本,忽略数据文件。
  • -exec chmod 750 {} +:将文件批处理到单个 chmod 运行中,赋予所有者完全权限、组执行访问权限,并使脚本对其他用户保密。

当您需要加强对可执行文件的权限而不干扰目录结构的其余部分时,请使用此选项。

高级示例 5:使脚本可供所有人执行

chmod +x scriptname

此命令为“scriptname”的用户、组和其他人添加执行权限:

  • +x:添加执行权限。

当您创建新脚本并希望使其可执行时,这是常见操作。

高级示例 6:使用 +X 进行更智能的递归更改

chmod -R u+X,g+X /srv/shared

首都+X运算符仅向已设置至少一个执行位的目录和文件添加执行权限。这可以防止常规文件意外变为可执行文件,同时仍然允许用户遍历目录。

  • -R:递归应用更改。
  • u+X,g+X:在适当的情况下为所有者和组添加执行权限。

使用+X准备共享目录时。它通过跳过应保留纯数据的不可执行文件来保持安全性。

快速参考:常见权限模式

为了快速参考,以下是按场景组织的最常用的权限模式:

标准文件和目录权限

数字象征性的意义典型用例
第644章rw-r–r–所有者:读/写,组/其他:读常规文件、文档、网页内容(最常见的文件权限)
第755章RWX-XR所有者:完全控制,组/其他:读取/执行目录、脚本、可执行文件(最常见的目录权限)
600RW——-所有者:读/写,组/其他:无私人文件、SSH 密钥、密码、敏感配置
700rwx——所有者:完全控制,组/其他:无私有目录、~/.ssh/、个人脚本
第444章r–r–r–所有人:只读受保护的参考文件、您不想修改的系统文档
第555章r-xr-xr-x每个人:读/执行,不写受保护的可执行文件、只读共享目录

协作团队权限

数字象征性的意义典型用例
第664章RW-RW-R–所有者/组:读/写,其他:读团队成员可以编辑的共享团队文件
660读写-读写——所有者/组:读/写,其他:无私人团队文件,项目数据仅限于小组
第775章rwxrwxr-x所有者/组:完全控制,其他:读取/执行共享团队目录、协作项目
第770章rwxrwx—所有者/组:完全控制,其他:无私人团队目录、受限协作空间
2775rwxrwsr-xsetgid:新文件继承组所有权共享项目目录(确保团队成员保持组访问权限)

特殊权限和高风险模式

数字象征性的意义使用案例/安全警告
4755rwsr-xr-xSetuid:以所有者权限运行系统二进制文件,例如 passwd、sudo。谨慎使用; setuid 授予升级权限。
2755rwxr-sr-xSetgid:以组权限运行新文件自动继承组所有权的共享目录。
第1777章读写x读写x读写Sticky bit:只有所有者才能删除自己的文件/tmp 目录,公共上传文件夹。防止用户删除其他人的文件。
第777章读写x读写x读写x所有人:完全控制(危险!)⚠️除非绝对必要,否则避免。重大安全风险;任何人都可以修改/删除。
第666章RW-RW-RW-每个人:读/写⚠️很少合适。仅用于临时共享数据文件,切勿用于可执行文件。

选择权限时,开始限制性 (600/700),仅根据需要放松。稍后授予访问权限比从过于宽松的设置导致的安全漏洞中恢复更容易。

管理 umask 和默认权限

当 Linux 创建新文件或目录时,它会以广泛的默认权限开始(文件为 666,目录为 777),然后减去当前权限umask价值。结果成为实际的权限集。了解您的 umask 可以解释为什么新文件并不总是继承您期望的权限。

要检查 shell 会话的活动 umask:

umask

输出是一个八进制值。例如,umask 为0022减去组和其他人的写权限。新文件显示为 644 (666 – 022),新目录显示为 755 (777 – 022)。

您可以暂时更改当前 shell 的掩码:

# Restrictive default for private workstations
umask 0077

# Collaborative default where team members share a group
umask 0027

通常,当您希望新文件默认为私有时,请使用限制性掩码(如 077)。在组成员需要访问的共享目录中工作时,请使用协作掩码(例如 027 或 002)。请记住,umask 只影响未来的文件;如果需要,使用 chmod 调整现有文件。

现实世界的权限场景

了解上下文中的权限有助于您在实际情况中正确应用 chmod。以下是您会遇到的常见场景。

Web 服务器文件和目录

对于 Apache 或 Nginx Web 服务器,适当的权限可以防止安全漏洞,同时允许 Web 服务器运行:

# Web root directories
chmod 755 /var/www/html

# Static files (HTML, CSS, JS, images)
find /var/www/html -type f -exec chmod 644 {} \;

# Directories
find /var/www/html -type d -exec chmod 755 {} \;

# Writable directories (uploads, cache)
chmod 775 /var/www/html/uploads
chmod 775 /var/www/html/cache

切勿在可通过 Web 访问的目录上使用 777。您允许任何人修改文件,从而造成严重的安全风险。

SSH 密钥和配置

SSH 对密钥权限非常严格,如果过于宽松就会拒绝工作:

# SSH directory
chmod 700 ~/.ssh

# Private keys (critical - must be 600)
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_ed25519

# Public keys
chmod 644 ~/.ssh/id_rsa.pub

# Authorized keys file
chmod 600 ~/.ssh/authorized_keys

# SSH config file
chmod 600 ~/.ssh/config

如果您的 SSH 密钥权限错误,您将收到“权限过于开放”错误,并且 SSH 将拒绝使用它们。

共享项目目录

当多个用户在同一个项目上工作时,请使用带有 setgid 位的组权限:

# Set up shared project directory
chmod 2775 /shared/project

# This ensures:
# - Owner and group can read, write, execute
# - Others can read and execute
# - New files inherit the group (setgid bit)
# - Team members can collaborate effectively

脚本部署

将脚本部署到生产环境时,安全性很重要:

# Production scripts (executable by owner only)
chmod 700 /usr/local/bin/backup-script.sh

# Scripts that need group execution (multiple admins)
chmod 750 /usr/local/bin/deploy-app.sh

# System-wide utilities (all users can execute)
chmod 755 /usr/local/bin/check-status.sh

用户主目录安全

保护用户主目录免遭窥探:

# Home directory (owner can do everything, others can't access)
chmod 700 /home/username

# Personal files
chmod 600 ~/personal-notes.txt
chmod 600 ~/financial-data.csv

# Scripts you want to run
chmod 700 ~/bin/my-script.sh

要避免的常见错误

即使是经验丰富的 Linux 用户有时也会犯权限错误。以下是最常见的陷阱以及如何避免它们。

chmod 777 陷阱

最危险的 chmod 错误是使用 777 来“修复”权限问题:

# WRONG - Never do this
chmod -R 777 /var/www/html

这使得每个文件都可写,这意味着任何用户(或受感染的进程)都可以修改、删除或注入恶意代码。对目录使用 755,对文件使用 644。对于特定的共享临时目录(如 /tmp),仅使用 777 和粘性位(1777):

# Correct pattern for shared scratch space
chmod 1777 /srv/shared/tmp

系统目录的递归权限更改

切勿在系统目录上运行递归 chmod:

# EXTREMELY DANGEROUS - Can break your entire system
chmod -R 755 /
chmod -R 644 /etc

这会破坏系统二进制文件、配置文件,并可能使您的系统无法启动。在使用 -R 之前,始终针对特定目录并仔细检查您的路径。

混淆所有权与权限

chmod 更改权限,但不会更改所有权。如果即使在 chmod 之后您仍收到“权限被拒绝”,请检查所有权:

# Check who owns the file
ls -l filename

# If owned by wrong user, use chown (requires sudo)
sudo chown username:groupname filename

# Then set permissions
chmod 644 filename

请记住:chmod = 权限(读、写、执行),chown = 所有权(谁拥有它)。

忽略目录的执行权限

目录的执行权限与文件的执行权限含义不同。没有它,您将无法进入目录或访问其中的文件,即使它们是可读的:

# WRONG - Directory without execute permission
chmod 644 /path/to/directory  # Can't cd into it

# RIGHT - Directories need execute permission
chmod 755 /path/to/directory  # Now you can access it

符号链接和权限

符号链接上的 chmod 会更改目标文件的权限,而不是链接本身。符号链接始终显示 777 权限,但这会被忽略:

# This changes the target file, not the link
chmod 644 symlink  # Modifies the file symlink points to

为了避免更改错误的文件,请始终验证符号链接指向的位置ls -l在运行 chmod 之前。

忘记特殊权限

当您使用三位数设置权限时,您会删除特殊位(setuid、setgid、sticky):

# This removes the setgid bit if it was set
chmod 755 directory  # Setgid bit is cleared

# To preserve setgid, use four digits
chmod 2755 directory  # Explicitly sets setgid + 755

权限问题疑难解答

权限问题在 Linux 中很常见。以下是如何系统地诊断和修复它们。

权限被拒绝错误

当您看到“权限被拒绝”时,请按照以下故障排除顺序进行操作:

  1. 检查当前权限和所有权:
ls -l /path/to/file
  1. 验证您是所有者或属于正确的组:
whoami        # Check your username
groups        # Check your groups
id            # See both username and groups
  1. 根据需要修复权限或所有权:
# If permissions are wrong
chmod 755 /path/to/file

# If ownership is wrong (requires sudo)
sudo chown youruser:yourgroup /path/to/file

脚本不会执行

如果您的脚本在尝试运行时显示“权限被拒绝”:

# Check if execute permission is set
ls -l script.sh

# Add execute permission
chmod +x script.sh

# Or set specific permissions
chmod 755 script.sh

# Now run it
./script.sh

无法访问目录内容

如果您可以列出某个目录但无法访问其中的文件,则该目录缺乏执行权限:

# Check directory permissions
ls -ld /path/to/directory

# Add execute permission to directory
chmod +x /path/to/directory

# Or set full directory permissions
chmod 755 /path/to/directory

何时使用 sudo 进行 chmod 更改

如果您不是所有者,则 chmod 需要 sudo。但是,使用 sudo 会以 root 身份更改文件,这可能会产生所有权问题:

# If you need to change permissions on files you don't own
sudo chmod 644 /etc/config-file

# But be careful - check if you should change ownership instead
sudo chown youruser:yourgroup /path/to/file
chmod 644 /path/to/file  # Now you can chmod without sudo

SELinux 和 AppArmor 注意事项

在具有 SELinux(RHEL、Fedora、Rocky Linux)或 AppArmor(Ubuntu、Debian)的系统上,文件权限只是访问控制的一部分。如果 chmod 不能解决您的问题,请检查安全上下文:

# Check SELinux context
ls -Z /path/to/file

# Check if SELinux is blocking access
sudo ausearch -m avc -ts recent

# Temporarily disable SELinux for testing (not recommended for production)
sudo setenforce 0
# Return to enforcing mode immediately after testing
sudo setenforce 1

如果 SELinux 或 AppArmor 阻止访问,除了文件权限之外,您还需要调整安全策略。在测试后始终将 SELinux 返回到强制模式并更新策略,而不是让系统处于宽松状态。

扩展 ACL 和 chmod

现代 Linux 发行版支持 POSIX 访问控制列表 (ACL) 以实现细粒度的权限。如果文件在 chmod 后仍然表现异常,请检查 ACL 是否覆盖标准模式位:

# View ACL entries
getfacl /path/to/file

# Grant a user read/write access without changing group ownership
setfacl -m u:alice:rw /path/to/file

# Remove ACL entries when they are no longer needed
setfacl -b /path/to/file

ACL 条目与 chmod 一起工作。在假设数字模式位说明了整个情况之前,请务必先检查 ACL。

结论

chmod 命令对于管理 Linux 中的文件权限至关重要。从基本的权限更改到递归操作和特殊权限位等高级技术,掌握 chmod 可以帮助您有效地控制对文件和目录的访问。这里介绍的示例应该为您在现实场景中处理权限奠定坚实的基础。在测试环境中练习这些命令以建立信心,并在使文件全局可读或全局可写之前始终考虑安全隐患。