所有托管服务节省 15%

测试技能,享折扣

使用代码: Skills 开始使用
China
Linux 管理

如何检查 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

通过相加各个值来计算每个用户类别的权限值:

组合计算数字值
rwx4 + 2 + 17
rw-4 + 2 + 06
r-x4 + 0 + 15
r--4 + 0 + 04
---0 + 0 + 00

三位八进制数字代表完整的权限集:

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/project

3. 粘性位(t 在其他人的执行位上)

当在目录上设置时,只有文件的所有者(或 root)可以删除或重命名其中的文件,即使其他人有写权限。这是 /tmp 的标准配置:

ls -ld /tmp
drwxrwxrwt 12 root root 4096 Aug 16 12:30 /tmp

末尾的 t 表示粘性位处于活动状态。

特殊位的数字表示:

特殊位数值
setuid4000
setgid2000
粘性位1000

所以 drwxrwxrwt = 1777(1000 + 777)。

完整权限参考表

符号数字文件上的含义目录上的含义
---0无访问权限无访问权限
--x1仅执行仅进入
-w-2仅写入修改内容(需要 x
-wx3写入 + 执行进入并修改
r--4仅读取列出名称(需要 x 才能有用)
r-x5读取 + 执行列出并进入
rw-6读取 + 写入列出并修改(不进入)
rwx7完全访问完全控制

真实权限示例

以下是您在实践中会遇到的最常见的权限模式:

-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 注册的多个域名的机器 — 以下是一些必要的权限最佳实践:

  1. 除非有非常具体的临时原因,否则不要在文件或目录上设置 777。世界可写文件是一个重大安全风险。
  2. Web 服务器文件(例如在 /var/www/ 下)通常应该是 644 用于文件,755 用于目录,由你的应用用户拥有。
  3. SSH 密钥必须是 600 用于私钥,644 用于公钥。SSH 严格执行这一点。
  4. 包含密码或 API 密钥的配置文件应该是 600 或最多 640
  5. 使用 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)和数字表示法(755644)— 因为不同的工具和文档可互换地使用两者。
  • 记住目录的区别: 目录上的执行位(x)表示进入目录的能力,而不是运行目录的能力。
  • 注意特殊位 — setuid、setgid和粘性位 — 因为它们经常出现在生产系统中,具有重要的安全影响。

正确的权限管理是Linux安全的基石。无论您是在VPS主机上运行个人项目,还是管理一批独立服务器,从一开始就正确设置权限将使您免受安全漏洞、应用程序损坏和无数小时的故障排除。