TL;DR
Linux 文件权限控制谁可以读取、写入或执行文件和目录。每个权限由三层(所有者、组、其他人)和三种操作(r=4, w=2, x=1)描述。chmod 755 表示所有者拥有完全访问权限(7=rwx),组和其他人拥有读取和执行权限(5=r-x)。使用我们的免费 chmod 计算器,无需记住八进制数学即可生成精确命令。 免费 chmod 计算器
关键要点
- 每个 Linux 文件都有三个权限层:所有者(u)、组(g)和其他人(o)。
- 读取=4,写入=2,执行=1。每层相加:chmod 644 = rw-r--r--。
- 目录和可执行文件用 chmod 755;普通文件用 chmod 644;敏感文件用 chmod 600。
- chmod -R 递归应用权限;使用 find 对文件和目录分别应用不同规则。
- 特殊位:setuid(4000)、setgid(2000)、sticky bit(1000)——使用前务必理解其含义。
- 生产环境中永远不要使用 chmod 777——它让系统上的每个用户都有读/写/执行权限。
- 使用 chown 更改所有权,chgrp 更改组,chmod 更改权限。
- ACL(访问控制列表)将经典的 9 位模型扩展为每用户和每组规则。 试试我们的 chmod 计算器.
1. 什么是 Linux 文件权限?
Linux 或类 Unix 系统上的每个文件和目录都携带一组文件权限来控制访问。这些权限以元数据形式存储在文件旁边,内核在每次读取、写入或执行操作时都会强制执行。运行 ls -la 时,最左侧的列显示权限字符串,例如 -rwxr-xr--。理解此字符串是掌握 Linux 安全的第一步。
权限系统有三种基本访问类型。读取(r)允许用户查看文件内容或列出目录内容。写入(w)允许修改文件或在目录中创建、删除和重命名条目。执行(x)允许将文件作为程序(脚本、二进制文件)运行,或使用 cd 命令进入目录。没有目录的执行权限,即使有读取权限也无法访问其中的任何内容。
ls -l 的权限字符串有 10 个字符。第一个字符表示文件类型:- 是普通文件,d 是目录,l 是符号链接。其余九个字符是三组各三位,分别代表所有者、组和其他人的权限。
-rwxr-xr-- 2 alice webteam 4096 Feb 27 deploy.sh
^└─ 文件类型: - = 普通文件
\rwx────── 所有者(alice): 读 + 写 + 执行
\r-x─── 组(webteam): 读 + 执行
\r-- 其他人: 仅读2. 三层模型:所有者、组、其他人
Linux 使用三层访问模型。所有者(也称"用户"或"u")是创建文件的账户。组("g")是共享公共访问权限的用户命名集合。其他人("o")指系统上所有既不是所有者也不在文件组中的其他人。
内核检查权限时按顺序检查各层。如果请求用户是文件所有者,则应用所有者位,不再进行进一步检查。如果用户是文件组的成员,则应用组位。否则,应用其他人位。常见陷阱:权限为 ---rwxrwx 的文件给所有者无访问权,而组和其他人有完全访问权。
使用 ls -la 可以查看文件的所有者和组——第三列和第四列分别显示所有者和组名称。使用 stat filename 获取更多详情,包括权限的八进制表示:
$ ls -la deploy.sh
-rwxr-xr-- 1 alice webteam 4096 deploy.sh
$ stat deploy.sh
File: deploy.sh
Size: 4096 Blocks: 8 IO Block: 4096 regular file
Access: (0754/-rwxr-xr--) Uid: ( 1001/ alice) Gid: ( 1002/ webteam)3. 数字(八进制)vs 符号表示法
Linux 权限可以用两种方式表示:数字(八进制)和符号。两者都表示相同的九个位,但在不同场景下各有优势。数字形式在一次设置所有权限时更快更直观。符号形式在只想添加或删除单个权限而不影响其他权限时更好。
在数字模式中,每种权限类型被分配一个数值:读取 = 4,写入 = 2,执行 = 1。对每层(所有者、组、其他人),将想要授予的权限值相加,产生 0 到 7 之间的数字。三个这样的数字构成完整的权限号。例如,chmod 755 意味着:所有者 7(4+2+1 = rwx),组 5(4+0+1 = r-x),其他人 5(4+0+1 = r-x)。
八个可能八进制数字的快速参考:
| 八进制 | 符号 | 含义 |
|---|---|---|
| 0 | --- | 无权限 |
| 1 | --x | 仅执行 |
| 2 | -w- | 仅写入 |
| 3 | -wx | 写入 + 执行 |
| 4 | r-- | 仅读取 |
| 5 | r-x | 读取 + 执行 |
| 6 | rw- | 读取 + 写入 |
| 7 | rwx | 读取 + 写入 + 执行 |
在符号模式中,指定谁(u=所有者,g=组,o=其他人,a=所有人),操作符(+=添加,-=删除,==精确设置)和权限(r、w、x)。多个更改可以用逗号分隔。符号模式的关键优势是不会改变未提及的位。
# 数字模式——一次设置所有九个位
chmod 755 script.sh # rwxr-xr-x
chmod 644 index.html # rw-r--r--
chmod 600 .env # rw-------
# 符号模式——修改特定位
chmod u+x script.sh # 为所有者添加执行权限
chmod go-w config.php # 从组和其他人删除写权限
chmod a+r readme.txt # 为所有人添加读权限
chmod u=rwx,go=rx dir/ # 精确设置:7554. 常用权限值:644、755、777、700、600
某些权限值在 Web 开发、DevOps 和系统管理中经常出现。熟记它们让你更快更安全。以下是最重要的 chmod 值综合参考表:
| 八进制 | 符号 | 含义 | 典型用途 |
|---|---|---|---|
| 777 | rwxrwxrwx | 所有人完全访问 | 仅临时调试,生产环境绝不使用 |
| 755 | rwxr-xr-x | 所有者完全;其他人读+执行 | 目录、可执行脚本、Web 服务器文档根 |
| 775 | rwxrwxr-x | 所有者+组完全;其他人读+执行 | 共享团队目录 |
| 750 | rwxr-x--- | 所有者完全;组读+执行;其他人无 | 私有项目目录 |
| 700 | rwx------ | 仅所有者完全访问 | ~/.ssh 目录,私有脚本 |
| 666 | rw-rw-rw- | 所有人读+写,无执行 | 临时共享文件(罕用) |
| 644 | rw-r--r-- | 所有者读+写;其他人只读 | HTML、CSS、PHP、普通文档 |
| 640 | rw-r----- | 所有者读+写;组只读;其他人无 | 日志文件、共享配置 |
| 600 | rw------- | 仅所有者读+写 | SSH 私钥、.env 文件、数据库凭据 |
| 400 | r-------- | 仅所有者只读 | SSL 证书、只读机密 |
最重要的三个值:644(标准文件)、755(标准目录或可执行文件)和 600(敏感机密)。记住这三个,你就能正确处理 90% 的现实场景。
对于 Web 服务器,典型约定是目录用 755,文件用 644。这允许 Web 服务器进程(通常以 www-data 或 nginx 运行)遍历目录和读取文件,同时防止未授权修改。包含凭据的配置文件应该是 640 或 600。
5. 理解 setuid、setgid 和 Sticky Bit
除了标准的九个权限位外,Linux 还支持三个特殊权限位,用于修改文件和目录的行为方式。它们在八进制表示法中用前导第四位数字表示,在 ls -l 输出中显示为特殊字符。误解它们是常见的安全漏洞来源。
setuid(SUID)—— 4000
当 setuid 位设置在可执行文件上时,进程以文件所有者的有效用户 ID运行,而不是执行它的用户。经典例子是 /usr/bin/passwd:它需要 root 权限来修改 /etc/shadow,但任何用户都必须能够更改自己的密码。在 ls -l 中,SUID 替换所有者执行位:-rwsr-xr-x。
setgid(SGID)—— 2000
在可执行文件上,setgid 使进程以文件的组作为有效组 ID 运行。在目录上更常用:目录内创建的新文件和子目录自动继承目录的组,而不是创建者的主组。这是共享团队目录的标准机制。
Sticky Bit —— 1000
在目录上,sticky bit 限制删除:只有文件所有者、目录所有者或 root 才能删除或重命名其中的文件,即使其他用户对目录有写入权限。典型例子是 /tmp(权限 1777)。
# 设置特殊位(数字:前缀加 4、2 或 1)
chmod 4755 /usr/local/bin/myapp # setuid: rwsr-xr-x
chmod 2775 /var/www/shared # setgid: rwxrwsr-x
chmod 1777 /tmp/scratch # sticky: rwxrwxrwt
# 符号替代
chmod u+s myapp # 设置 SUID
chmod g+s shared/ # 在目录上设置 SGID
chmod +t scratch/ # 设置 sticky bit6. chmod vs chown vs chgrp
Linux 中的权限管理涉及三个经常被混淆的不同命令。理解它们之间的差异对正确的系统管理至关重要。
chmod(更改模式)修改文件或目录的权限位。它改变谁可以读取、写入或执行文件,但不改变文件的所有者或组。语法:chmod [选项] 模式 文件...
chown(更改所有者)更改文件的所有者和可选的组。只有 root 可以更改文件的所有者。普通用户可以将组更改为他们所属的另一个组。语法:chown [选项] 所有者[:组] 文件...
chgrp(更改组)仅更改文件的组。等同于 chown :group file,但在只想更改组时更明确。语法:chgrp [选项] 组 文件...
# chmod: 更改权限
chmod 644 config.php
chmod u+x deploy.sh
# chown: 更改所有者
chown alice file.txt # 将所有者更改为 alice
chown alice:webteam file.txt # 更改所有者和组
chown -R www-data:www-data /var/www/html/
# chgrp: 更改组
chgrp webteam project.conf
chgrp -R developers /srv/app/7. 使用 ls -la 查看权限
ls -la 命令是检查文件权限的标准方式。-l 标志启用长格式,-a 显示隐藏文件。每行包含权限字符串、硬链接数、所有者名、组名、文件大小、修改时间戳和文件名。
解读权限字符串:第一个字符是文件类型。接下来三个字符是所有者的权限(读、写、执行)。随后三个是组的权限。最后三个是其他人的权限。字母表示授予了该权限,短横线表示拒绝。
$ ls -la /var/www/html/
total 48
drwxr-xr-x 4 www-data www-data 4096 Feb 27 .
-rw-r--r-- 1 www-data www-data 2048 Feb 27 index.html
-rw-r----- 1 www-data www-data 512 Feb 25 config.php
drwxrws--- 2 www-data webteam 4096 Feb 27 uploads/
# -rw-r----- 的解析:
# - : 普通文件
# rw- : 所有者可读写 (6)
# r-- : 组只能读 (4)
# --- : 其他人无权限 (0)
# = chmod 640stat 命令提供更多详情,包括直接显示八进制权限值。这在脚本编写和验证时非常有用:
$ stat /var/www/html/config.php
File: /var/www/html/config.php
Size: 512
Access: (0640/-rw-r-----)
Uid: (33/www-data) Gid: (33/www-data)8. 使用 chmod -R 递归更改权限
-R(递归)标志将权限更改应用于目录及其所有内容。虽然方便,但必须谨慎使用,因为它对文件和目录应用相同的权限位——而这两者通常有不同的需求。
简单的 chmod -R 755 的问题:目录需要执行权限(可遍历),但普通文件通常不应该可执行。递归设置 755 会使每个文件都可执行,这既不必要又是安全隐患。
正确方法是使用 find 结合 -type f 和 -type d 对文件和目录分别应用不同的权限:
# 错误:也会让所有文件可执行
chmod -R 755 /var/www/html/
# 正确:对文件和目录分别设置不同权限
find /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +9. Web 服务器权限最佳实践
Web 服务器权限是任何应用部署中最关键的安全配置之一。设置错误可能导致数据泄露、网站篡改或权限提升。
Web 根目录文件和目录:标准约定是文件 644,目录 755。Web 服务器进程(www-data、nginx 或 apache)需要读取文件和遍历目录的权限,但永远不要给 Web 服务器对 Web 根目录的写访问权限。
# 标准 Web 服务器权限
find /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +
# 所有权:root 拥有文件,Web 服务器可读
chown -R root:www-data /var/www/html/
# PHP/配置文件:更严格
chmod 640 /var/www/html/config.php
chmod 600 /var/www/html/.env上传目录:如果应用允许文件上传,上传目录必须对 Web 服务器进程可写:
# 上传目录:Web 服务器可写
chmod 2775 /var/www/html/uploads/
chown root:www-data /var/www/html/uploads/SSH 密钥:SSH 对密钥权限非常严格。权限过于开放时,SSH 会拒绝使用密钥。
# SSH 密钥:需要精确的权限
chmod 700 ~/.ssh/
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys环境和机密文件:包含 API 密钥、数据库密码和其他凭据的文件必须限制为最低必要访问权限:
# 机密文件:仅所有者读写
chmod 600 .env
chmod 600 database.yml
chmod 400 ssl-private.key需要生成精确的 chmod 命令? 使用我们的免费 chmod 计算器 ——勾选复选框即可即时查看八进制值、符号表示和完整的 chmod 命令。
10. 故障排查:403 Forbidden 和 Permission denied
权限错误是部署期间应用程序故障最常见的原因之一。最常见的两个错误是 HTTP 403 Forbidden 和 shell 的"Permission denied"消息。
HTTP 403 Forbidden
Web 服务器的 403 错误几乎总是表示权限问题。检查文件本身AND路径中所有父目录的权限:
# 检查完整路径权限
namei -l /var/www/html/app/config.php
# 修复目录
chmod 755 /var/www/html/app/
# 检查 Web 服务器用户是否可以读取文件
sudo -u www-data stat /var/www/html/app/config.phpShell 中的 Permission Denied
Shell "Permission denied" 错误发生在用户缺少必要的权限位时。使用 ls -la 诊断并与当前用户比较:
# 检查当前用户
whoami && id
# 检查文件权限
ls -la problematic-file
# 常见修复
chmod +x script.sh # 忘记使脚本可执行
sudo chown $USER file # 错误的所有者11. 文件 vs 目录权限:关键差异
相同的权限位对文件和目录意义不同。这种区别让许多开发者困惑,尤其是在设置递归权限时。
对于文件:读取(r)允许查看文件内容。写入(w)允许修改或替换文件内容。执行(x)允许将文件作为程序运行。
对于目录:读取(r)允许使用 ls 列出目录内容。写入(w)允许在目录内创建、删除和重命名条目。执行(x)允许使用 cd 进入目录并按名称访问其中的文件。
| 权限位 | 文件 | 目录 |
|---|---|---|
| r (4) | 查看文件内容 (cat, less, vim) | 列出目录内容 (ls) |
| w (2) | 修改、覆盖、截断文件 | 在目录内创建、删除、重命名条目 |
| x (1) | 将文件作为程序运行 | 进入目录 (cd),通过名称访问文件 |
目录的写入权限允许删除其中的任何文件,无论文件本身的权限如何。这就是 /tmp 上的 sticky bit(1000)至关重要的原因——它防止用户删除彼此的文件,尽管对目录有写访问权限。
12. ACL(访问控制列表)用于高级权限
经典的 Unix 权限模型(所有者/组/其他人)每个文件只允许一个所有者和一个组。对于需要多个特定用户或组访问的场景,该模型变得有限。访问控制列表(ACL)将权限系统扩展为允许每用户和每组规则。
ACL 在大多数现代 Linux 文件系统(ext4、xfs、btrfs)上受支持,可以使用 getfacl 和 setfacl 命令管理。
# 查看 ACL
getfacl /var/www/project/
# 授予特定用户(bob)读取权限
setfacl -m u:bob:r-- /var/www/project/secret.conf
# 授予特定组写访问权限
setfacl -m g:deployteam:rw /var/www/project/config/
# 递归应用 ACL
setfacl -R -m u:bob:rx /var/www/project/
# 为新文件设置默认 ACL
setfacl -d -m u:bob:rx /var/www/project/
# 删除 ACL 条目
setfacl -x u:bob /var/www/project/secret.conf当文件有 ACL 时,ls -l 在权限字符串后显示 +:-rw-r--r--+。使用 getfacl filename 查看完整 ACL。
13. 常见问题
chmod 755 是什么意思?
chmod 755 将所有者权限设置为 rwx(读+写+执行=7),组设置为 r-x(读+执行=5),其他人设置为 r-x(5)。符号表示:rwxr-xr-x。这是目录和可执行脚本的标准权限,因为所有人都可以读取和进入/运行,但只有所有者可以修改。
chmod 644 和 chmod 755 有什么区别?
chmod 644(rw-r--r--)从所有三层删除执行权限。这是普通文件(如 HTML、CSS、PHP 文件和文档)的标准设置,这些文件应该被读取但不应被执行。chmod 755(rwxr-xr-x)向所有三层添加执行权限,适用于目录(执行=遍历)和可执行脚本。
chmod 777 有时安全吗?
chmod 777 给系统上的每个用户完全的读、写和执行权限。在生产环境中几乎永远不安全。如果你的应用只在 777 下工作,实际问题是错误的所有权或组成员身份。
如何使 shell 脚本可执行?
使用 chmod +x script.sh 为所有者添加执行权限。如果其他人也需要运行它,使用 chmod 755 script.sh。记住,使文件可执行并不保证它会正确运行——还需要在顶部有有效的 shebang 行(如 #!/bin/bash)和已安装的正确解释器。
什么是 umask 以及它如何影响新文件权限?
umask(用户文件创建掩码)在创建新文件时从默认权限中减去。新文件的默认权限是 666,目录是 777。常见的 umask 022 导致文件以 644(666-022)创建,目录以 755 创建。运行 umask 查看当前值,在 ~/.bashrc 中设置使其持久化。
ls -la 输出中的 + 是什么意思?
权限字符串末尾的 + 表示文件有超出标准模型的扩展 ACL 条目。使用 getfacl filename 查看完整 ACL。点(.)表示文件应用了 SELinux 安全上下文。
如何递归修复 Web 服务器权限?
最安全的方法使用 find 对文件和目录分别应用不同的权限。运行:find /var/www/html -type d -exec chmod 755 {} + 设置所有目录,然后 find /var/www/html -type f -exec chmod 644 {} + 设置所有文件。然后用 chown -R www-data:www-data /var/www/html 设置所有权。在运行递归命令前始终仔细检查目标路径。
可以在 macOS 上使用 chmod 吗?
可以。macOS 基于 BSD Unix,支持与 Linux 相同的 chmod 语法,包括数字和符号模式。macOS 还有自己的扩展 ACL 系统(使用 chmod +a 和 chmod -a)。
总结
理解 Linux 文件权限是每个使用服务器、容器或 CI/CD 管道的开发者的基础技能。三层模型(所有者、组、其他人)、数字编码(读取=4,写入=2,执行=1)和关键值(644、755、600)覆盖了绝大多数现实场景。使用我们的 chmod 计算器无需手动计算八进制即可生成所需的精确命令。