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
。
其他说明
- 八进制值通过相加计算:读取 (4) + 写入 (2) + 执行 (1)
- 使用
chmod
命令更改权限(例如chmod 755 文件名
) - 存在特殊权限:SetUID (4)、SetGID (2)、Sticky Bit (1)
- 文件类型指示符位于权限之前(例如,'-' 表示常规文件,'d' 表示目录)
查看文件权限
这会检查配置文件上的权限。
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 -ld
。1
是链接计数,root root
显示所有者和组。
更改文件权限
这使得脚本可执行。
chmod 755 backup.sh
chmod 755
命令将 backup.sh
设置为 rwxr-xr-x
:7
(所有者:rwx = 4+2+1)、5
(组:r-x = 4+1)、5
(其他人:r-x = 4+1)。数字模式是绝对的——它会替换现有权限。先用 ls -l backup.sh
检查,之后确认。执行 (x
) 对脚本至关重要;没有它,./backup.sh
会失败。需要所有者或 root 权限。
使用 chmod 的符号模式
这会为组添加写入权限。
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
)。比数字模式更灵活。
更改文件所有权
这会将文件转移给新用户。
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
进行仅组的更改。这会影响谁可以修改权限。
特殊权限
这会在二进制文件和目录上设置特殊权限。
# 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 022
umask 022
命令会从基本权限(文件为 666,目录为 777)中减去,生成文件的 644
(rw-r--r--) 和目录的 755
(rwxr-xr-x)。单独运行 umask
来检查当前值。使用 touch test; ls -l test
进行测试。在 ~/.bashrc
中设置以使其持久化。022
很常见——组/其他人无法写入。对于组写入,请使用 002
(例如 664
)。
示例:递归权限更改
这会更新目录树的权限。
chmod -R 750 /home/user/docs
-R
选项将 750
(rwxr-x---) 递归应用于 /home/user/docs
及其所有内容。所有者获得完全访问权限,组获得读取/执行权限,其他人无权限。使用 ls -lR
在操作前/后进行验证。使用 find /home/user/docs -ls
进行详细查看。请注意——它会覆盖现有权限。添加 -v
以获取详细输出。非常适合保护项目目录。
示例:批量所有权更改
这会重新分配文件之间的所有权。
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 / -perm -o+w 2>/dev/null
find
命令从 /
开始搜索对其他人具有写入权限的文件(-o+w
),例如 ----r--rw-
。将错误(例如,权限被拒绝)重定向到 /dev/null
。使用 -perm 777
进行精确匹配。使用 ls -l
检查结果。这是一个安全审计工具——对所有人可写的文件可能存在风险。限制范围(例如 /home
)以减少噪音。
文件权限最佳实践
- 最小权限原则:仅授予用户和组必要的权限。
- 定期审计权限:定期审查文件和目录权限以确保安全。
- 有效利用组:将用户分配到组,并在组级别管理权限。
- 避免过度使用 SUID/SGID:谨慎使用 SUID 和 SGID 以最大程度地降低安全风险。
来源
在本文中,我们探讨了管理 Linux 文件权限的各种示例,包括查看、更改和设置特殊权限。