DevToolBox免费
博客

chmod 计算器在线指南:Linux 文件权限完全手册

12 分钟阅读作者 DevToolBox

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--    其他人: 仅读

→ 立即试用我们的免费交互式 chmod 计算器

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写入 + 执行
4r--仅读取
5r-x读取 + 执行
6rw-读取 + 写入
7rwx读取 + 写入 + 执行

符号模式中,指定u=所有者,g=组,o=其他人,a=所有人),操作符+=添加,-=删除,==精确设置)和权限rwx)。多个更改可以用逗号分隔。符号模式的关键优势是不会改变未提及的位。

# 数字模式——一次设置所有九个位
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/ # 精确设置:755

4. 常用权限值:644、755、777、700、600

某些权限值在 Web 开发、DevOps 和系统管理中经常出现。熟记它们让你更快更安全。以下是最重要的 chmod 值综合参考表:

八进制符号含义典型用途
777rwxrwxrwx所有人完全访问仅临时调试,生产环境绝不使用
755rwxr-xr-x所有者完全;其他人读+执行目录、可执行脚本、Web 服务器文档根
775rwxrwxr-x所有者+组完全;其他人读+执行共享团队目录
750rwxr-x---所有者完全;组读+执行;其他人无私有项目目录
700rwx------仅所有者完全访问~/.ssh 目录,私有脚本
666rw-rw-rw-所有人读+写,无执行临时共享文件(罕用)
644rw-r--r--所有者读+写;其他人只读HTML、CSS、PHP、普通文档
640rw-r-----所有者读+写;组只读;其他人无日志文件、共享配置
600rw-------仅所有者读+写SSH 私钥、.env 文件、数据库凭据
400r--------仅所有者只读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 bit

6. 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 640

stat 命令提供更多详情,包括直接显示八进制权限值。这在脚本编写和验证时非常有用:

$ 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.php

Shell 中的 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)上受支持,可以使用 getfaclsetfacl 命令管理。

# 查看 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 计算器无需手动计算八进制即可生成所需的精确命令。

使用我们的免费在线 chmod 计算器即时计算任何 chmod 值。

𝕏 Twitterin LinkedIn
这篇文章有帮助吗?

保持更新

获取每周开发技巧和新工具通知。

无垃圾邮件,随时退订。

试试这些相关工具

🔐Chmod CalculatorB64Base64 Encoder/Decoder#Hash Generator🔑Password Generator

相关文章

Linux 文件权限完全指南:chmod 计算器与权限速查表

通过本完整的 chmod 计算器指南掌握 Linux 文件权限。涵盖八进制表示法、chmod 速查表、特殊权限和开发者最佳实践。

Linux 文件权限详解:chmod 777、755、644 的含义

理解 Linux 文件权限、chmod 命令和八进制表示法。通过实例学习 chmod 777、755、644 的含义。

Linux chmod、chown 和 chgrp:文件权限指南

Linux 文件权限完全指南:chmod 数字和符号模式、chown、chgrp、特殊权限(setuid、setgid、sticky bit)和 ACL。

Crontab 速查表 2025:50+ 个你一定会用到的 Cron 表达式实例

完整的 crontab 速查表,包含 50+ 个真实 cron 表达式示例。涵盖每隔X分钟、每小时、每天、每周、每月调度,以及 GitHub Actions、AWS、Kubernetes 平台语法。