所有托管服务节省 15%

测试技能,享折扣

使用代码: Skills 开始使用
China
Linux 操作系统 虚拟服务器

理解Linux文件权限及其管理方法

Linux 文件权限是系统管理中最基础的方面之一,也是最容易被误解的方面之一。无论你是在管理生产 Web 服务器、部署应用程序还是编写自动化脚本,对 Linux 权限模型的深入理解都是必不可少的。如果配置错误,你可能会面临数据泄露、部署失败或服务锁定的风险。如果配置正确,你将拥有一个强大的、细粒度的安全框架为你服务。

本指南涵盖了你需要了解的所有内容:权限模型的工作原理、如何读取和修改权限、如何管理所有权,以及如何处理 SUID、SGID 和粘着位等高级权限位。

Linux 文件权限模型详解

Linux 系统中的每个文件和目录都被分配了一组访问权限。这些权限分布在三个用户类别三种权限类型中。

三个用户类别

类别描述
owner拥有该文件的用户
group属于该文件所分配组的所有用户
others系统上的其他所有人

三种权限类型

权限符号含义
readr查看文件内容或列出目录内容
writew修改文件或目录
executex将文件作为程序运行,或进入/遍历目录

这九位(三个类别 × 三种权限)共同定义了文件系统中每个对象的完整访问控制配置文件。

如何使用 ls -l 查看文件权限

检查权限的最快方法是使用 ls -l 命令:

ls -l myscript.sh

示例输出:

-rwxr-xr-- 1 alice devs 2048 Jan 25 10:00 myscript.sh

以下是如何逐个字符读取该权限字符串:

字符含义
-文件类型(- = 普通文件,d = 目录,l = 符号链接)
rwx所有者权限:读、写、执行
r-x权限:读、执行(无写入)
r--其他人权限:仅读

因此在此示例中,alice(所有者)具有完全访问权限,devs 组的成员可以读取和执行该文件,其他所有人只能读取它。

使用 chmod 更改权限

chmod 命令修改文件权限。它支持两种模式:符号和数字(八进制)。
符号模式
符号模式使用字母和运算符来添加 (+)、删除 (-) 或设置 (=) 权限:
chmod u+x myscript.sh      # Add execute permission for the owner
chmod g-w myscript.sh      # Remove write permission from the group
chmod o=r myscript.sh      # Set read-only for others (exactly)
chmod a+x myscript.sh      # Add execute for all (owner, group, others)
目标类别为:u(用户/所有者)、g(组)、o(其他)、a(全部)。
数字(八进制)模式
每种权限类型都有一个数值:r = 4、w = 2、x = 1。您将它们相加以获得每个类别的单个数字。




八进制
二进制
权限




7
111
rwx


6
110
rw-


5
101
r-x


4
100
r--


0
000
---




常见示例:
chmod 755 myscript.sh   # Owner: rwx | Group: r-x | Others: r-x
chmod 644 file.txt      # Owner: rw- | Group: r-- | Others: r--
chmod 700 script.sh     # Owner: rwx | Group: --- | Others: ---
chmod 600 secret.key    # Owner: rw- | Group: --- | Others: ---
> 快速参考:755 是面向公众的脚本和目录的标准。644 是可读配置文件的标准。600 非常适合私钥和敏感凭据。
使用 chown 和 chgrp 管理所有权
权限只有在所有权的背景下才有意义。chown 和 chgrp 命令让您将文件分配给正确的用户和组。
更改文件所有者
chown alice file.txt
更改组
chgrp devs file.txt
同时更改所有者和组
chown bob:admins file.txt
递归应用更改
-R 标志将所有权更改应用于目录及其所有内容 — 这在设置 Web 服务器文档根目录时至关重要:
chown -R www-data:www-data /var/www/html/
这是在 VPS 主机环境中部署 Web 应用程序的关键步骤,确保您的 Web 服务器进程具有正确的文件访问权限。
特殊权限位:SUID、SGID 和 Sticky Bit
除了标准的九个权限位,Linux 支持三种特殊模式,可以以重要的方式修改默认行为。
1. SUID — Set User ID
适用于:可执行文件
当在可执行文件上设置 SUID 位时,它以文件所有者的权限运行,而不是启动它的用户的权限。
chmod u+s /usr/bin/passwd
ls -l 输出:
-rwsr-xr-x 1 root root 54256 Jan 10 08:00 /usr/bin/passwd
注意所有者的 x 位置上的 s。这就是 /usr/bin/passwd 即使由普通用户运行也能更新 /etc/shadow(一个 root 拥有的文件)的原因。
> 安全提示:在自定义脚本上设置 SUID 时要非常谨慎。配置不当的 SUID 二进制文件是经典的权限提升向量。
2. SGID — Set Group ID
适用于:可执行文件和目录

在文件上:文件以文件组所有者的组权限运行。
在目录上:在目录内创建的新文件自动继承目录的组,而不是创建用户的主组。

chmod g+s /opt/project
ls -l 输出:
drwxr-sr-x 2 alice devs 4096 Jan 25 10:00 /opt/project
目录上的 SGID 对于共享开发文件夹非常有用,其中多个团队成员需要所有新文件上的一致组所有权。
3. Sticky Bit
适用于:目录
当在目录上设置 sticky bit 时,只有文件的所有者(或 root)可以删除或重命名该文件——即使其他用户对目录有写权限。
chmod +t /shared/folder
ls -ld 对 /tmp 的输出:
drwxrwxrwt 10 root root 4096 Jan 28 12:00 /tmp
末尾的 t 表示 sticky bit 处于活动状态。这就是为什么 /tmp 对所有人可写,但用户无法删除彼此的临时文件。
理解 umask — 默认权限控制
当创建新文件或目录时,Linux 不会给予它最大权限。相反,它应用一个 umask(用户文件创建掩码)来从默认值中减去权限。
检查您当前的 umask
umask
常见输出: 0022

umask 如何工作

对象默认最大值使用 umask `0022`结果
文件666 (rw-rw-rw-)666 - 022644 (rw-r–r–)
目录777 (rwxrwxrwx)777 - 022755 (rwxr-xr-x)

> 注意:无论 umask 如何,Linux 默认不会在新创建的文件上设置执行位。

设置临时 umask

umask 0077    # New files: 600 (rw-------), New dirs: 700 (rwx------)

这在创建敏感临时文件的脚本中很有用。对于永久更改,请将 umask 命令添加到您的 shell 配置文件(例如 ~/.bashrc/etc/profile)。

递归权限修复

一个常见的现实任务是重置整个项目目录的权限——例如,在部署失败或FTP上传破坏权限之后。关键是为目录和文件设置不同的权限,因为目录需要执行位才能被遍历。

# Set all directories to 755
find /var/www/myapp -type d -exec chmod 755 {} ;

# Set all files to 644
find /var/www/myapp -type f -exec chmod 644 {} ;

如果您的应用程序有特定的可执行脚本,请在之后单独修复这些脚本:

chmod 755 /var/www/myapp/bin/*.sh

这种模式对于任何管理Web托管环境的人来说都是必不可少的。如果您在带有cPanel的VPS上运行PHP、Python或Node.js应用程序,不正确的文件权限是403 Forbidden错误和脚本执行失败的最常见原因之一。

常见场景的实用权限参考

场景推荐权限命令
公共网络文件 (HTML, CSS, JS)644chmod 644 index.html
网络目录755chmod 755 /var/www/html
PHP/Python 脚本644755取决于执行方法
私有 SSH 密钥600chmod 600 ~/.ssh/id_rsa
.ssh 目录700chmod 700 ~/.ssh
共享项目目录2775 (SGID)chmod 2775 /opt/project
世界可写的临时目录1777 (sticky)chmod 1777 /tmp/shared
包含机密的配置文件600chmod 600 .env

Linux 文件权限和服务器安全

理解文件权限不仅仅是一个学术练习 — 它对服务器安全和稳定性有直接的实际影响。

要避免的常见安全错误:

  • 在网络目录上设置 777 这给予每个人读、写和执行访问权限 — 如果您的服务器被破坏或 PHP 代码注入成为可能,这是一个严重漏洞。
  • 留下世界可读的配置文件。.envwp-config.php 这样的文件或数据库凭证应该是 600 或最多 640
  • 忽视所有权。 即使权限看起来正确,如果错误的用户拥有文件,您的网络服务器或应用程序守护进程可能无法读取它。
  • 在系统目录上递归 chownchown -R 上不小心运行 /etc/usr 可能会破坏您的整个系统。

如果您在专用服务器上运行生产环境,实施严格的权限策略是初始设置后您应该采取的首批强化步骤之一。

对于管理多个站点或应用程序的团队,VPS 控制面板可以通过图形文件管理器简化权限管理,尽管命令行熟练程度对于高级配置仍然至关重要。

快速命令参考

# View permissions
ls -l filename
ls -ld directory/

# Change permissions (symbolic)
chmod u+x file        # Add execute for owner
chmod g-w file        # Remove write for group
chmod o=r file        # Set read-only for others
chmod a+r file        # Add read for all

# Change permissions (numeric)
chmod 755 file        # rwxr-xr-x
chmod 644 file        # rw-r--r--
chmod 600 file        # rw-------
chmod 700 file        # rwx------

# Change ownership
chown user file
chgrp group file
chown user:group file
chown -R user:group directory/

# Special bits
chmod u+s file        # Set SUID
chmod g+s directory   # Set SGID
chmod +t directory    # Set sticky bit

# umask
umask                 # Show current umask
umask 0022            # Set umask for session

# Recursive fixes
find /path -type d -exec chmod 755 {} ;
find /path -type f -exec chmod 644 {} ;

结论

Linux 文件权限是系统安全、多用户访问控制和可靠应用程序部署的基础。该模型在简洁性上是优雅的——三个类别、三种权限类型、少数几个特殊位——但功能强大到足以保护从个人开发机器到高流量生产服务器的一切。

掌握 chmodchownumask 和特殊权限位,让你能够自信地部署应用程序、快速排查访问错误,并加强服务器防御未授权访问。

无论你是开始使用共享虚拟主机还是扩展到完全托管的 VPS 主机环境,对 Linux 文件权限的深入理解是系统管理员或开发人员可以培养的最高杠杆技能之一。投入时间深入理解它——你的服务器(和你的用户)会感谢你。