如何检查 Linux 中的文件权限:完整指南
Linux 为全球大多数服务器提供支持——从 VPS Hosting 环境到企业级 Dedicated Servers——这是有原因的。它速度快、稳定,并且在其核心内置了安全性。该安全性的最基本支柱之一是文件权限系统:一种精确、优雅的机制,可以精确控制谁可以读取、修改或执行系统上的任何文件或目录。
无论您是部署 Web 应用程序的开发人员、加强服务器安全的系统管理员,还是学习命令行的初学者,理解如何在 Linux 中检查和解释文件权限都是一项不可或缺的技能。本指南涵盖了您需要了解的所有内容——从权限模型的基础知识到高级特殊位——包括实用命令和真实示例。
什么是 Linux 文件权限?
Linux 中的每个文件和目录都附加了一组权限。这些权限定义了允许的操作以及谁可以执行这些操作。有三种核心权限类型:
| 权限 | 符号 | 对文件的作用 | 对目录的作用 |
|---|---|---|---|
| 读取 | r | 查看文件的内容 | 列出内部文件的名称 |
| 写入 | w | 修改或删除文件 | 在内部创建或删除文件 |
| 执行 | x | 将文件作为程序运行 | 进入(导航到)目录 |
这三种权限独立应用于三个不同的用户类别:
- 所有者(用户) — 拥有文件的用户,通常是其创建者。
- 组 — 属于文件分配组的任何用户。
- 其他人 — 系统上的其他所有人。
这个三乘三的权限矩阵使 Linux 管理员能够对系统上的每个资源进行细粒度的强大访问控制。
如何检查文件权限:ls -l 命令
检查文件权限最快和最常用的方法是 ls -l 命令(长列表格式)。
ls -l file.txt示例输出:
-rw-r--r-- 1 alice developers 1024 Aug 16 12:30 file.txt让我们分解此输出的每个组件:
- rw- r-- r-- 1 alice developers 1024 Aug 16 12:30 file.txt
│ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ └─ Filename
│ │ │ │ │ │ │ │ └─ Last modified
│ │ │ │ │ │ │ └─ File size (bytes)
│ │ │ │ │ │ └─ Group name
│ │ │ │ │ └─ Owner name
│ │ │ │ └─ Number of hard links
│ │ │ └─ Others' permissions
│ │ └─ Group's permissions
│ └─ Owner's permissions
└─ File type (- = regular file, d = directory, l = symlink)所以 -rw-r--r-- 告诉我们:
- 所有者(
alice):读取 + 写入(rw-) - 组(
developers):仅读取(r--) - 其他:仅读取(
r--)
检查多个文件的权限
要一次查看目录中所有文件的权限:
ls -la /var/www/html-a 标志包括隐藏文件(以点开头的文件)。这在审计 共享网络托管或 VPS 环境中的 Web 服务器目录时特别有用。
使用 stat 获取详细权限信息
如需更全面的分解 — 包括符号和数字表示法 — 请使用 stat 命令:
stat file.txt示例输出:
File: file.txt
Size: 1024 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 131073 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ alice) Gid: ( 1000/developers)
Access: 2024-08-16 12:30:00.000000000 +0000
Modify: 2024-08-16 12:30:00.000000000 +0000
Change: 2024-08-16 12:30:00.000000000 +0000关键行是:
Access: (0644/-rw-r--r--) Uid: ( 1000/ alice) Gid: ( 1000/developers)这为您提供:
- 数字(八进制)表示法:
0644 - 符号表示法:
-rw-r--r-- - 用户 ID (UID) 和 组 ID (GID) 及其人类可读的名称
stat 命令在排查生产服务器上的权限错误时非常宝贵,因为它在单个输出中提供了您需要的所有上下文。
理解数字(八进制)权限表示法
Linux 权限可以用数字表示,这是 chmod 等命令使用的格式。每个权限类型都分配有一个值:
| 权限 | 数字值 |
|---|---|
读取 (r) | 4 |
写入 (w) | 2 |
执行 (x) | 1 |
无权限 (-) | 0 |
通过相加各个值来计算每个用户类别的权限值:
| 组合 | 计算 | 数字值 |
|---|---|---|
rwx | 4 + 2 + 1 | 7 |
rw- | 4 + 2 + 0 | 6 |
r-x | 4 + 0 + 1 | 5 |
r-- | 4 + 0 + 0 | 4 |
--- | 0 + 0 + 0 | 0 |
三位八进制数字代表完整的权限集:
0644 → Owner: 6 (rw-) | Group: 4 (r--) | Others: 4 (r--)
0755 → Owner: 7 (rwx) | Group: 5 (r-x) | Others: 5 (r-x)
0700 → Owner: 7 (rwx) | Group: 0 (---) | Others: 0 (---)检查目录权限
目录使用相同的权限模型,但每个位的含义略有不同。使用 ls -ld(注意 -d 标志)来检查目录本身而不是其内容:
ls -ld myfolder示例输出:
drwxr-x--- 2 alice developers 4096 Aug 16 12:30 myfolder前导的 d 确认这是一个目录。权限分解如下:
- 所有者(
alice):rwx— 可以列出、创建/删除文件和进入目录 - 组(
developers):r-x— 可以列出文件和进入,但不能创建或删除 - 其他:
---— 无任何访问权限
> 重要:目录上的执行位(x)表示进入它的能力(即使用 cd)。没有 x,用户无法进入目录,即使他们有读权限。这是新手常见的混淆来源。
特殊权限位:setuid、setgid 和粘性位
除了标准的九个权限位外,Linux 还支持三个特殊权限位,提供高级访问控制:
1. setuid(s 在所有者执行位上)
当在可执行文件上设置时,程序以文件所有者的权限运行,而不是调用用户的权限。这就是 passwd 等命令允许普通用户修改 /etc/shadow(由 root 拥有)的方式。
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 Mar 27 2023 /usr/bin/passwd所有者执行位置中的 s 表示 setuid。
2. setgid(s 在组的执行位上)
在文件上,程序以组的权限运行。在目录上,在其中创建的新文件会自动继承目录的组 — 对于共享项目文件夹很有用。
ls -ld /shared/project
drwxrwsr-x 2 alice developers 4096 Aug 16 12:30 /shared/project3. 粘性位(t 在其他人的执行位上)
当在目录上设置时,只有文件的所有者(或 root)可以删除或重命名其中的文件,即使其他人有写权限。这是 /tmp 的标准配置:
ls -ld /tmp
drwxrwxrwt 12 root root 4096 Aug 16 12:30 /tmp末尾的 t 表示粘性位处于活动状态。
特殊位的数字表示:
| 特殊位 | 数值 |
|---|---|
| setuid | 4000 |
| setgid | 2000 |
| 粘性位 | 1000 |
所以 drwxrwxrwt = 1777(1000 + 777)。
完整权限参考表
| 符号 | 数字 | 文件上的含义 | 目录上的含义 |
|---|---|---|---|
--- | 0 | 无访问权限 | 无访问权限 |
--x | 1 | 仅执行 | 仅进入 |
-w- | 2 | 仅写入 | 修改内容(需要 x) |
-wx | 3 | 写入 + 执行 | 进入并修改 |
r-- | 4 | 仅读取 | 列出名称(需要 x 才能有用) |
r-x | 5 | 读取 + 执行 | 列出并进入 |
rw- | 6 | 读取 + 写入 | 列出并修改(不进入) |
rwx | 7 | 完全访问 | 完全控制 |
真实权限示例
以下是您在实践中会遇到的最常见的权限模式:
-rw-r--r-- (0644) — 标准文件
-rw-r--r-- 1 alice developers 1024 Aug 16 12:30 config.txt所有者可以读写。组和其他人只能读。典型用于配置文件和网络内容。
-rwxr-xr-x (0755) — 可执行脚本或二进制文件
-rwxr-xr-x 1 alice developers 4096 Aug 16 12:30 deploy.sh所有者拥有完全访问权限。其他人可以读和执行但不能修改。标准用于shell脚本、网络服务器二进制文件和公共可执行文件。
-rw------- (0600) — 私有文件
-rw------- 1 alice alice 1679 Aug 16 12:30 id_rsa只有所有者可以读或写。其他人无法访问。SSH私钥需要此权限——SSH将拒绝使用权限过于宽松的密钥文件。
drwxr-xr-x (0755) — 标准公共目录
drwxr-xr-x 5 alice developers 4096 Aug 16 12:30 public_html常用于网络根目录。所有者拥有完全控制权;其他人可以浏览和进入。
drwx------ (0700) — 私有目录
drwx------ 3 alice alice 4096 Aug 16 12:30 .ssh完全私有。只有所有者可以访问。~/.ssh 目录需要此权限。
drwxrwxrwt (1777) — 世界可写且粘滞位
drwxrwxrwt 12 root root 4096 Aug 16 12:30 /tmp每个人都可以创建文件,但只有每个文件的所有者可以删除他们自己的文件。
服务器环境实用技巧
如果你管理 Linux 服务器 — 无论是运行 Web 应用的 VPS、使用 SSL Certificate 保护的邮件服务器,还是托管通过 Domain Registration 注册的多个域名的机器 — 以下是一些必要的权限最佳实践:
- 除非有非常具体的临时原因,否则不要在文件或目录上设置 777。世界可写文件是一个重大安全风险。
- Web 服务器文件(例如在
/var/www/下)通常应该是644用于文件,755用于目录,由你的应用用户拥有。 - SSH 密钥必须是
600用于私钥,644用于公钥。SSH 严格执行这一点。 - 包含密码或 API 密钥的配置文件应该是
600或最多640。 - 使用
find审计权限跨目录树:
# Find all world-writable files (potential security risk)
find /var/www -type f -perm -o+w
# Find all SUID files (for security auditing)
find / -type f -perm -4000 2>/dev/null快速命令参考
| 任务 | 命令 |
|---|---|
| 列出文件的权限 | ls -l filename |
| 列出目录中所有文件的权限 | ls -la /path/to/dir |
| 检查目录本身的权限 | ls -ld /path/to/dir |
| 获取完整详情,包括数字权限 | stat filename |
| 更改权限(符号方式) | chmod u+x filename |
| 更改权限(数字方式) | chmod 755 filename |
| 更改文件所有者 | chown user:group filename |
| 递归更改权限 | chmod -R 755 /path/to/dir |
| 查找世界可写文件 | find . -perm -o+w -type f |
结论
理解Linux文件权限不仅仅是学术练习——它是任何管理服务器、部署应用程序或在Linux环境中工作的人的实用日常技能。总结关键要点:
- 使用
ls -l快速查看文件和目录权限的人类可读概览。 - 使用
stat当您需要符号和数字表示以及所有权详细信息时。 - 掌握两种表示法 — 符号表示法(
rwx)和数字表示法(755、644)— 因为不同的工具和文档可互换地使用两者。 - 记住目录的区别: 目录上的执行位(
x)表示进入目录的能力,而不是运行目录的能力。 - 注意特殊位 — setuid、setgid和粘性位 — 因为它们经常出现在生产系统中,具有重要的安全影响。
正确的权限管理是Linux安全的基石。无论您是在VPS主机上运行个人项目,还是管理一批独立服务器,从一开始就正确设置权限将使您免受安全漏洞、应用程序损坏和无数小时的故障排除。
