如何检查 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 标志包括隐藏文件(以点开头的文件)。这在审计 Shared Web Hosting 或 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所有者可以读取和写入。组和其他人只能读取。典型用于配置文件和 Web 内容。
-rwxr-xr-x(0755)——可执行脚本或二进制文件
-rwxr-xr-x 1 alice developers 4096 Aug 16 12:30 deploy.sh所有者拥有完全访问权限。其他所有人可以读取和执行,但无法修改。标准用于 shell 脚本、Web 服务器二进制文件和公共可执行文件。
-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_htmlWeb 根目录的常见设置。所有者拥有完全控制权;其他人可以浏览和进入。
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 严格执行此操作。
