Linux 文件权限终极指南:chmod、chown 等命令详解

Linux 文件权限决定了谁可以读取、修改、执行或访问文件和目录。它们影响日常的服务器工作,包括部署、SSH 密钥、脚本、上传、备份、日志和共享文件夹。

本指南面向开发者、管理员、DevOps 初学者、网站所有者,以及所有通过终端使用 Linux 的人。您只需要命令行访问权限以及 ls、chmod、chown、chgrp 和 find 等基本工具。

如果您在 Linux VPS 服务器上管理网站、应用程序、脚本或数据库,理解文件权限可以帮助您找到访问问题的真正原因,而不是依赖 chmod 777 这类不安全的“修复”方式。

理解 Linux 权限模型

Linux 权限围绕三个访问级别构建:用户(user)、组(group)和其他人(others)。用户是文件或目录的所有者。组允许多个账户共享受控的访问权限。其他人则涵盖系统中的所有其他用户。

这个模型很简单,但在实际的服务器工作中非常实用。部署用户可以管理应用程序文件,Web 服务器所在的组可以读取所需内容,而无关用户则可以被阻止修改敏感数据。

Linux 还使用三种核心权限类型:读(read)、写(write)和执行(execute)。它们看起来很直观,但对文件和目录的作用有所不同,许多权限错误正是从这里开始的。

用户、组与其他人,读、写、执行:每种权限的作用

每个文件和目录都有一个所有者和一个所属组。当请求访问时,Linux 按以下顺序检查权限:先检查所有者,再检查组,最后检查其他人。它只使用第一个匹配的类别,因此权限不会叠加。

每个类别都可以拥有读、写和执行权限。对于文件,读表示查看内容,写表示编辑,执行表示将文件作为脚本或程序运行。对于目录,读表示列出其中的条目,写表示创建或删除条目,执行表示进入该目录。

最后一点非常重要。如果没有目录的执行权限,用户也许能看到目录名称,却仍然无法访问其中的文件。这就是为什么检查权限时应覆盖完整路径,而不仅仅是最终的文件。

如何在 Linux 中检查文件权限

检查 Linux 文件权限最常用的命令是:

ls -l

典型的输出行可能如下所示:

-rwxr-xr-- 1 deploy www-data 2048 May 8 app.sh

第一个字符表示文件类型。普通文件以 - 开头,目录以 d 开头。接下来的九个字符分别表示所有者、组和其他人的权限。在此示例中,rwx 属于所有者,r-x 属于组,r-- 属于其他人。

所有者是 deploy,组是 www-data。这意味着 deploy 用户获得所有者权限,www-data 组中的用户获得组权限,其他所有人获得“其他人”权限。

解读 ls -l 的输出,八进制与符号表示法

权限字符串始终遵循相同的结构。第一个字符标识对象类型。接下来的三个字符属于所有者,再接下来的三个属于组,最后三个属于其他人。

例如:

drwxr-xr-x

这是一个目录,因为它以 d 开头。所有者可以读取、写入和进入该目录。组可以读取和进入。其他人也可以读取和进入,但不能在其中创建或删除文件。

对于普通文件,您可能会看到:

-rw-r--r--

这表示所有者可以读写,而组和其他人只能读取。对于公开的网站文件、静态资源以及应对所有人可见但不可编辑的文档,这是一种常见的权限模式。

Linux 权限可以用符号表示法或八进制表示法书写。符号表示法使用 r、w 和 x 等字母。八进制表示法使用数字,其中读等于 4,写等于 2,执行等于 1。

每个身份级别的数字会相加。读和写为 6,读和执行为 5,读、写和执行为 7,无任何权限为 0。例如 755 表示所有者为 7,组为 5,其他人为 5,用符号形式表示就是 rwxr-xr-x。又如 644 表示所有者可以读写,而组和其他人只能读取。

如何使用 chmod 修改文件权限

chmod 命令用于修改文件和目录的权限。它支持两种格式:符号模式和数字模式。

符号模式最适合做小幅修改,例如为脚本添加执行权限而不改变其他任何设置。当您已经知道确切的权限值时,例如目录用 755、普通文件用 644,数字模式会更快捷。

常见权限值详解:符号模式(chmod u+x、chmod go-w)与数字模式(chmod 755、chmod 644)

符号模式使用身份字母、运算符和权限字母。身份字母包括 u 表示用户,g 表示组,o 表示其他人,a 表示所有人。运算符包括 + 添加权限,- 移除权限,= 精确设置权限。

例如:

chmod u+x script.sh

这会为所有者添加执行权限。当 shell 脚本存在但无法直接运行时,常常使用此命令。

另一个实用的命令是:

chmod go-w file.txt

这会移除组和其他人的写权限。当文件应保持可读、但只允许所有者编辑时,这个命令非常有用。

数字模式通过一条命令设置完整的权限值。例如:

chmod 755 script.sh

这允许所有者读取、写入和执行该文件,而组和其他人可以读取和执行。

另一个常用命令是:

chmod 644 index.html

这允许所有者编辑文件,而组和其他人只能读取。这是网站文件的常见设置。

权限值

常见用途

含义

安全提示

755

目录和可执行脚本

所有者可以读、写、执行。组和其他人可以读和执行

适用于必须可访问、但不允许所有人写入的目录

644

普通网站文件、文档、公开可读的文件

所有者可以读写。组和其他人只能读取

适合作为许多 Web 文件和静态资源的默认值

777

在生产环境中几乎从不适用

所有人都可以读、写、执行

危险,因为任何用户或进程都可以修改该条目

对于 777 这个值,需要发出严格的警告。它会向系统中的所有人授予完全访问权限。在公共服务器、共享环境或 Rocky Linux VPS 上,这可能让存在漏洞的脚本、被入侵的用户或恶意进程修改本应受到保护的文件。在大多数情况下,chmod 777 并不能解决真正的问题,它只会掩盖所有权、组成员身份、服务用户或应用程序配置方面更深层的问题。

使用 chown 和 chgrp 修改文件所有权

权限定义了所有者、组和其他人可以做什么,而所有权则定义了所有者和组究竟是谁。这就是 chmod 和 chown 解决不同问题的原因。

修改所有者的基本语法是:

chown user file

要同时修改所有者和组,请使用:

chown user:group file

只修改组,请使用:

chown :group file

您也可以使用以下命令只修改组:

chgrp group file

例如:

chown deploy:www-data /var/www/example.com

这会将 deploy 设为所有者,将 www-data 设为组。在 Web 项目中,这样可以让部署用户管理文件,同时为 Web 服务器提供受控的组访问权限。

可以使用以下命令递归修改所有权:

chown -R user:group directory

递归操作应谨慎使用,因为它会修改目标目录中每一个条目的所有权。在执行递归所有权修改之前,请用 pwd 确认路径,用 ls 检查目标,并确保您没有误将更改应用到范围很广的系统目录上。

两者的实际区别很简单:当文件的所有者正确但访问级别不对时,使用 chmod;当文件的所有者或所属组不对时,使用 chown 或 chgrp。

递归修改权限

递归权限修改会将同一规则应用于整个目录树。它们在部署、迁移、备份和清理任务中很有用,但也是最容易制造权限问题的操作之一。

一个有风险的命令如下所示:

chmod -R 755 /var/www/example.com

这会对每个文件和目录都应用 755。目录通常需要执行权限,因为用户和服务必须能够进入它们,但普通文件通常不需要执行权限。对所有内容应用相同的值,可能会无端地让普通文件变为可执行。

更安全的做法是使用 find,为目录和文件分别设置权限:

find /var/www/example.com -type d -exec chmod 755 {} \;
find /var/www/example.com -type f -exec chmod 644 {} \;

这种模式在 Web 项目中很常见。目录保持可访问,普通文件保持可读,只有所有者可以修改内容。当应用程序运行在 BlueVPS 服务器上时,这种可预测的结构也让故障排查更加容易,因为文件和目录出于明确的理由遵循不同的规则。

递归命令在执行前都应仔细检查。路径中的一个小笔误就可能改变成千上万个文件。在生产系统上操作时,最好先使用 find path -type f | head 或 find path -type d | head 测试目标,再应用更改。

特殊权限:SUID、SGID 和粘滞位

Linux 还支持会改变常规访问行为的特殊权限位。它们在特定场景下很有用,但应谨慎使用,尤其是在生产系统上。

SUID 让可执行文件以文件所有者的权限运行。这项功能很强大,因为程序可能会执行当前用户通常无法执行的操作,所以只有在理由明确时才应使用 SUID。

SGID 可用于文件和目录。对于文件,它让可执行文件以文件所属组的权限运行。对于目录,它让新建文件继承目录的所属组,这对共享项目文件夹很有帮助。

粘滞位(sticky bit)通常用于 /tmp 等共享的可写目录。它允许用户创建文件,但阻止用户删除其他人拥有的文件。

常见示例包括:

chmod u+s file
chmod g+s directory
chmod +t directory

对于大多数网站文件来说,特殊权限并不是日常设置。它们最适合用于有特定访问控制需求的场景,尤其是在生产系统上。

排查权限错误

权限错误并不总是由最终的文件引起。所有权、父目录、服务用户、SSH 密钥规则、文件系统挂载选项,以及 SELinux 或 AppArmor 等安全系统,都可能牵涉其中。

良好的排查流程应从当前用户开始,然后检查目标文件,再检查路径中的每一个父目录。这一点很重要,因为文件本身的权限可能是正确的,但某个父目录仍然会阻止访问。

错误或症状

可能原因

实用解决方案

Permission denied(权限被拒绝)

当前用户缺少所需的读、写或执行权限

检查 whoami,运行 ls -l,然后以最小必要范围调整权限或所有权

脚本无法运行

文件缺少执行权限

运行 chmod u+x script.sh,然后使用 ./script.sh 执行

无法进入目录

目录缺少执行权限

为正确的用户或组添加执行权限

Web 服务器返回 403 Forbidden

Web 服务器用户无法访问文件或父目录

检查完整路径上的所有权、组访问权限和目录权限

SSH 私钥被拒绝

私钥权限过于宽松

运行 chmod 600 ~/.ssh/id_rsa,并确认 .ssh 目录的所有权

应用程序无法上传文件

服务用户对上传目录没有写权限

修改上传目录的所有者或组,然后仅在需要的位置授予写权限

用 chmod 修改后仍无效

所有者错误、父目录问题、SELinux、AppArmor 或挂载限制

使用 namei -l path,检查服务用户,如已启用安全策略则进一步检查


在美国 VPS 上,这类排查通常通过 SSH 远程进行,因此遵循严谨的步骤可以节省时间:确认用户,检查目标文件,检查父目录,核实所有权,然后应用范围最小的安全更改。

快速参考:chmod 速查表

当您在日常 Linux 权限任务中需要快速查阅命令时,可以使用这张速查表,内容涵盖检查访问权限、修复所有权,以及为文件和目录应用安全的默认值。

任务

命令

显示文件权限

ls -l file

显示完整路径上的权限

namei -l /path/to/file

为所有者添加脚本执行权限

chmod u+x script.sh

移除组和其他人的写权限

chmod go-w file

设置标准文件权限

chmod 644 file

设置标准目录权限

chmod 755 directory

锁定 SSH 私钥

chmod 600 ~/.ssh/id_rsa

修改文件所有者

chown user file

修改所有者和组

chown user:group file

只修改组

chgrp group file

仅对目录应用 755

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

仅对文件应用 644

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

为共享目录添加粘滞位

chmod +t directory

为共享项目目录添加 SGID

chmod g+s directory

blog