ZetCode

Linux 文件权限

最后修改于 2025 年 2 月 25 日

Linux 文件权限控制着对文件和目录的访问,确保安全和适当的资源管理。本教程涵盖文件权限的基本和高级概念,包括如何使用实际示例查看、修改和管理它们。

Linux 中的文件权限分为三类:所有者其他人。每一类都有三种权限:读取写入执行

理解基本权限类型

下表概述了 Linux 中的三种基本权限类型:读取、写入和执行。每种权限都有一个特定的符号和一个相关的八进制值,这对于配置文件和目录访问至关重要。

基本权限类型
权限 符号 八进制值 描述 文件示例 目录示例
读取 r 4 允许查看文件内容 读取文本文件 列出目录内容 (ls/dir)
写入 w 2 允许修改内容 编辑文件 在目录中创建/删除文件
执行 x 1 允许执行 运行脚本/程序 访问目录 (cd)

这些基本权限构成了 Linux 访问控制的基础。对于文件,“读取”允许查看内容,“写入”启用编辑,“执行”允许将文件作为程序或脚本运行。

对于目录,含义略有变化:“读取”允许您列出内容,“写入”允许修改(如添加或删除文件),“执行”是使用 cd 等命令进入目录所必需的。

八进制值(4、2、1)用于数字表示法组合权限,我们稍后会看到。

定义用户类别

下表介绍了 Linux 权限适用的三个用户类别:所有者、组和其他人。每个类别都被分配了特定的权限来控制访问级别。

用户类别
类别 符号 描述 典型用例
所有者/用户 u 文件的创建者或指定的所有者 拥有完全控制权的个人文件
g 文件指定组中的用户 团队共享文件
其他人 o 所有其他系统用户 公共访问文件

在 Linux 中,权限会单独分配给这三类用户。“所有者”通常是创建文件的用户,并且通常拥有最多的特权。

“组”由分配给特定组的用户组成(可以使用 ls -l 查看),这对于协作很有用。

“其他人”包括系统上的所有其他用户,出于安全原因,通常只授予最少的访问权限。这些区别允许进行细粒度的控制,例如给予团队(组)读取权限,同时限制外部人员(其他人)。

探索权限表示法示例

下表演示了权限在符号和八进制表示法中的表示方式,并举例说明了常见的配置及其细分。

权限表示法示例
类型 示例 八进制 细分
符号 -rwxr-xr-x 755 所有者:rwx (7 = 4+2+1)
组:r-x (5 = 4+1)
其他人:r-x (5 = 4+1)
符号 -rw-r--r-- 644 所有者:rw- (6 = 4+2)
组:r-- (4)
其他人:r-- (4)
符号 -rwxrwxrwx 777 所有者:rwx (7 = 4+2+1)
组:rwx (7 = 4+2+1)
其他人:rwx (7 = 4+2+1)

权限表示法可以是符号形式(例如 rwxr-xr-x)或数字形式(例如 755)。符号形式使用 'r'、'w' 和 'x' 表示读取、写入和执行,'-' 表示没有权限。

八进制形式将其压缩为三个数字,每个用户类别(所有者、组、其他人)一个,通过将启用的权限值相加来计算。例如,755 授予所有者完全访问权限 (7),而组和其他人获得读取和执行权限 (5)。

777 示例显示了所有人的完全访问权限,由于安全风险,这种情况很少见,而 644 对于需要所有者编辑和公众阅读的文件很常见。

分解八进制权限计算

下表详细介绍了八进制值如何从权限组合中计算得出,显示了从 0 到 7 的每种可能的值及其符号、二进制和描述性等效项。

八进制权限计算
八进制值 符号表示法 二进制表示 计算 描述
0 --- 000 0 无权限
1 --x 001 1 仅执行
2 -w- 010 2 仅写入
3 -wx 011 2 + 1 = 3 写入和执行
4 r-- 100 4 仅读取
5 r-x 101 4 + 1 = 5 读取和执行
6 rw- 110 4 + 2 = 6 读取和写入
7 rwx 111 4 + 2 + 1 = 7 读取、写入和执行(完全权限)

八进制系统通过为每种权限分配值来简化权限设置:读取 (4)、写入 (2) 和执行 (1)。将它们相加形成每个用户类别的一个数字。

二进制表示(例如,5 为 101)也反映了这一点,每个位对应一个权限(1 表示启用,0 表示禁用)。例如,5(读取和执行)对于文件来说很少见,但对于目录来说很常见,而 6(读取和写入)适合可编辑的文档。

此表是构建任何权限字符串的参考,例如将所有者的 rw- (6) 与其他人的 r-- (4) 组合成 644

其他说明

查看文件权限

这会检查配置文件上的权限。

view_permissions.sh
ls -l /etc/nginx/nginx.conf

ls -l 命令列出了 /etc/nginx/nginx.conf 的详细信息。输出可能是:-rw-r--r-- 1 root root 1024 Feb 25 12:34 nginx.conf-rw-r--r-- 的细分是:- (文件)、rw- (所有者读/写)、r-- (组读)、r-- (其他人读)。目录请使用 ls -ld1 是链接计数,root root 显示所有者和组。

更改文件权限

这使得脚本可执行。

change_permissions.sh
chmod 755 backup.sh

chmod 755 命令将 backup.sh 设置为 rwxr-xr-x7 (所有者:rwx = 4+2+1)、5 (组:r-x = 4+1)、5 (其他人:r-x = 4+1)。数字模式是绝对的——它会替换现有权限。先用 ls -l backup.sh 检查,之后确认。执行 (x) 对脚本至关重要;没有它,./backup.sh 会失败。需要所有者或 root 权限。

使用 chmod 的符号模式

这会为组添加写入权限。

symbolic_mode.sh
chmod g+w team_doc.txt

g+w 选项为 team_doc.txt 上的组添加写入权限。符号模式会调整现有权限:u (用户/所有者)、g (组)、o (其他人)、+ (添加)、- (删除)、= (精确设置)。如果原先是 rw-r--r--,它将变为 rw-rw-r--。使用 ls -l 进行验证。可以进行多次更改(例如 chmod u+x,g-w)。比数字模式更灵活。

更改文件所有权

这会将文件转移给新用户。

change_ownership.sh
chown alice:devs project.c

chown alice:devs 命令将 project.c 的所有者设置为 alice,组设置为 devs。语法是 user:group。使用 ls -l 在操作前(例如,“bob:coders”)和操作后进行确认。需要 root 权限或当前所有权。使用 cat /etc/passwd 查看用户,使用 cat /etc/group 查看组。使用 chown :group 进行仅组的更改。这会影响谁可以修改权限。

特殊权限

这会在二进制文件和目录上设置特殊权限。

special_permissions.sh
# Set SUID on a binary
chmod u+s /usr/bin/passwd

# Set SGID on a shared directory
chmod g+s /var/team_data

# Set Sticky Bit on a public folder
chmod +t /tmp

特殊权限会调整行为:/usr/bin/passwd 上的 u+s (SUID) 以 root 身份运行(例如 rwsr-xr-x),允许用户更改密码。/var/team_data 上的 g+s (SGID) 确保新文件继承 team_data 组。/tmp 上的 +t (Sticky Bit)(rwxrwxrwt)将删除限制为所有者/root。使用 ls -l 进行验证。使用 find / -perm -4000 查找 SUID 文件。要谨慎应用——存在安全风险。

默认权限与 umask

这会设置新文件的默认值。

umask.sh
umask 022

umask 022 命令会从基本权限(文件为 666,目录为 777)中减去,生成文件的 644 (rw-r--r--) 和目录的 755 (rwxr-xr-x)。单独运行 umask 来检查当前值。使用 touch test; ls -l test 进行测试。在 ~/.bashrc 中设置以使其持久化。022 很常见——组/其他人无法写入。对于组写入,请使用 002(例如 664)。

示例:递归权限更改

这会更新目录树的权限。

recursive_change.sh
chmod -R 750 /home/user/docs

-R 选项将 750 (rwxr-x---) 递归应用于 /home/user/docs 及其所有内容。所有者获得完全访问权限,组获得读取/执行权限,其他人无权限。使用 ls -lR 在操作前/后进行验证。使用 find /home/user/docs -ls 进行详细查看。请注意——它会覆盖现有权限。添加 -v 以获取详细输出。非常适合保护项目目录。

示例:批量所有权更改

这会重新分配文件之间的所有权。

bulk_ownership.sh
chown -R webadmin:www-data /var/www

chown -R 命令将 /var/www 及其所有子文件的所有者设置为 webadmin,组设置为 www-data。这对于 Web 服务器很常见。使用 ls -lR /var/www 进行验证。先使用 find /var/www -user olduser 查找旧的所有权。需要 root 权限。添加 --from=olduser:oldgroup 以定位特定的先前所有者。确保服务的一致访问。

示例:按权限查找文件

这会查找对所有人可写的文件。

find_permissions.sh
find / -perm -o+w 2>/dev/null

find 命令从 / 开始搜索对其他人具有写入权限的文件(-o+w),例如 ----r--rw-。将错误(例如,权限被拒绝)重定向到 /dev/null。使用 -perm 777 进行精确匹配。使用 ls -l 检查结果。这是一个安全审计工具——对所有人可写的文件可能存在风险。限制范围(例如 /home)以减少噪音。

文件权限最佳实践

来源

GNU 文件权限文档

在本文中,我们探讨了管理 Linux 文件权限的各种示例,包括查看、更改和设置特殊权限。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直撰写编程文章。至今,我已撰写了超过 1,400 篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 Linux 教程