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 等安全系统,都可能牵涉其中。
良好的排查流程应从当前用户开始,然后检查目标文件,再检查路径中的每一个父目录。这一点很重要,因为文件本身的权限可能是正确的,但某个父目录仍然会阻止访问。
|
错误或症状 |
可能原因 |
实用解决方案 |
|
当前用户缺少所需的读、写或执行权限 |
检查 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 |