Linux 文件权限系统围绕属主、属组、其他人三大角色进行控制。本篇从概念出发,带你理解如何通过 chmod、chown 等操作,配置文件安全与访问策略。
一、Linux 文件权限概述
¶文件属主与属组
- 属主(Owner, u):创建或被指定为文件/目录拥有者的用户。
- 属组(Group, g):多个用户可以同属一个组,在组内具有共享/协同权限。
- 其他用户(Others, o):不属于该文件属主或属组的所有人。
¶基础权限位
r(读):对文件可读取内容;对目录可列出文件名。w(写):对文件可修改内容;对目录可创建、删除、重命名文件。x(执行):对文件可执行程序;对目录可cd进入、访问子文件。
示例权限串:rwxr-xr-x 表示:
- 属主拥有
rwx(4+2+1=7) - 属组拥有
r-x(4+0+1=5) - 其他拥有
r-x(4+0+1=5)
二、常规权限命令
¶1.chmod 与数字/符号表示法
¶数字表示
| 权限位 | 数字 |
|---|---|
| r (读) | 4 |
| w (写) | 2 |
| x (执行) | 1 |
三种权限相加构成属主、属组、其他三组数,如 754 表示 rwx / r-x / r--:
1 | chmod 754 file.sh |
代表让文件对于属主可读写执行,对于属组和其他仅读和执行。

¶符号表示
1 | chmod u+w file.txt |
u/g/o/a:针对属主/属组/其他/所有。+ - =:添加、去除、直接赋值权限。
¶2.chown 与所有权变更
1 | chown newowner file |
- 只有
root或具有特权的用户可执行。 chown能一次改属主和属组(用 “.” 或 “:” 分割),也可只改属组。
¶3.目录权限与区别
对目录而言:
r:可用ls查看目录内容。w:可在目录内新增/删除/改名文件。x:可cd进去或访问该目录里的内容。
¶4. umask
umask 是 Linux 和 Unix 系统中的一个命令,用于设置文件或目录的默认权限屏蔽值(User File Creation Mask)。它决定了新创建的文件或目录的默认权限。

如何计算权限?
-
默认权限:
- 文件默认权限:666(rw-rw-rw-,不包括执行权限)
- 目录默认权限:777(rwxrwxrwx,读、写、执行权限)
-
实际权限:
- 实际权限 = 默认权限 - umask 值
例如:umask 为 022,文件默认权限为 666,实际权限为:
1 | 666 - 022 = 644 (rw-r--r--) |
同样,目录默认权限为 777,实际权限为:
1 | 777 - 022 = 755 (rwxr-xr-x) |
如何查看和设置 umask
1 | umask |
设置新的 umask 值:
1 | umask 027 |
这里设置屏蔽值为 027,新创建的文件将具有权限 640,目录权限为 750。
永久设置 umask
编辑 Shell 配置文件(如 ~/.bashrc 或 ~/.zshrc),添加以下内容:
1 | umask 027 |
常见 umask 值
- 022:文件权限 644,目录权限 755(常用,保护文件不被其他用户修改)。
- 027:文件权限 640,目录权限 750(更严格,仅允许同组用户访问,常用于生产环境)。
- 002:文件权限 664,目录权限 775(适合共享环境,允许同组用户修改,常用于开发环境)。
¶5. 修改文件特殊属性 chattr
chattr 是 Linux 系统中的一个命令,用于更改文件或目录的属性(change attributes)。通过 chattr 设置的属性可以控制文件的某些行为,比如防止文件被删除或修改。可以通过 lsattr 查看到对应属性。
常见用途
- 保护文件不被修改或删除。
- 加速日志文件的追加写入。
- 防止文件被意外覆盖或重命名。
语法
1 | chattr [选项] [+/-/=][属性] 文件或目录 |
常用属性
| 属性 作用 | |
|---|---|
| a 仅允许追加写入(append-only)。 | |
| i 不允许修改或删除(immutable)。 | |
| d 在使用 dump 备份时,忽略该文件或目录。 | |
| e 文件使用扩展格式存储(extents),默认值。 | |
| s 文件被删除时,用 0 填充文件数据(安全删除)。 | |
| u 文件被删除时,内容会被保存,可以稍后恢复(undelete)。 |
示例
-
防止文件被删除或修改:
1
2
3
4sudo chattr +i example.txt
# 防止 /etc/fstab 或 /etc/passwd 等重要系统文件被误修改:
sudo chattr +i /etc/fstab -
日志文件只允许追加写入:
1
2
3
4sudo chattr +a logfile.txt
# 防止日志文件被覆盖或意外清空:
sudo chattr +a /var/log/syslog -
备份时忽略某个目录:
1
sudo chattr +d myfolder
注意事项
- 权限要求:需要超级用户权限(sudo)才能更改大多数文件的属性。
- 支持的文件系统:chattr 主要适用于 ext2/ext3/ext4 文件系统,其他文件系统可能不支持某些属性。
- 谨慎使用:设置 +i 属性后,无法删除或修改文件,只有超级用户能解除限制。
¶6. lsattr 查看特殊权限
| 选项 作用 | |
|---|---|
| -a 显示包括隐藏文件(以 . 开头的文件)的所有文件属性。 | |
| -d 显示目录本身的属性,而不是目录中的内容。 | |
| -R 递归显示目录及其子目录中的文件属性。 | |
| -v 显示文件的版本号(很少用)。 |
lsattr 输出中,每个文件或目录的属性由 10 个字符表示,常见的格式如下:

三、进阶:特殊权限(SUID / SGID / Sticky 位)
特殊权限可赋予可执行文件或目录,使它们具有超出常规 rwx 的特殊行为。本节重点分析 SUID、SGID、Sticky 三种。

¶1.SUID(Set User ID)
¶1.1 原理
当一个可执行文件被赋予 SUID 权限后,普通用户执行该文件时,会以该文件的属主身份运行程序,而不仅仅是调用者自身的身份。常见示例是 /usr/bin/passwd,它的属主为 root,且 SUID 生效,让任何用户都能安全地更改自己密码(进而写入 /etc/shadow)。

Why:SUID 让特定程序能突破调用者权限执行关键操作,但仅限程序内部实现,非给用户全局 root 权限。
¶1.2 查看与设置
ls -l 中,如果可执行文件设置了 SUID,则属主的执行权限位会显示 s 而非 x。例如:-rwsr-xr-x。
-
设置 SUID:
1
chmod u+s myprog
-
去除 SUID:
1
chmod u-s myprog
-
数字方式:在原有权限基础上加
4至属主位,比如chmod 4755 file表示rwsr-xr-x。
¶1.3 测试示例
先编写一个简易 C 程序 myprog.c
1 |
|
-
编译生成 myprog:
1
gcc -o myprog myprog.c
-
将属主设为 root 且加 SUID:
1
2sudo chown root myprog
sudo chmod 4755 myprog -
普通用户执行:
1
./myprog
打印出 Real UID 为当前普通用户,但 Effective UID 显示 0(root),从而以 root 权限执行 system("id")。

¶1.4 安全注意事项
- SUID 程序一旦出现漏洞,可能被恶意利用获取更高权限。
- 避免对不可信或不必要的程序设置 SUID。
- 检查并最小化系统 SUID 程序列表(
find / -perm -4000)以降低安全风险。
¶2.SGID(Set Group ID)
¶2.1 SGID 应用场景
- 可执行文件:进程运行时,其有效组 ID 替换为文件的属组。常见于一些特殊组可访问的工具。
- 目录:更常用场景:当目录设置 SGID,则在此目录中新建的文件或子目录会继承该目录的组,而非创建者的默认组,从而便于同一项目组成员共享文件,类似于共享文件夹的概念。下面创建的文件夹也会有对应的
s权限,实现了递归的效果。
¶2.2 设置 SGID
- 查看:若 sgid 在文件/目录属组执行位,则显示
s,如rwxr-sr-x。 - 设置:
chmod g+s shared_dir或数字方式加2,如chmod 2775 shared_dir。
¶2.3 案例:共享项目组目录
假如有 /home/project/ 目录,需要多个组员共同读写且希望新建文件继承组 dev:
-
建目录并属组设为
dev:1
2mkdir /home/project
chown :dev /home/project -
设 SGID:
1
chmod g+s /home/project
令各用户都在 dev 组内,这样任何人创建的文件都默认属组为 dev,便于组内共享。
¶3.Sticky 位(粘滞位)
¶3.1 作用与机理
Sticky 位最常见于多用户可写的公共目录,如 /tmp。当目录设置 Sticky 位后,该目录中文件只能被其属主或 root 删除或改名,即使其他人对该目录也有写权限,因此作用简单来说就是避免恶意用户删除他人的文件。
¶3.2 设置方法
chmod o+t dirname- 数字方式加
1:如chmod 1777 /tmp表示rwxrwxrwt。
¶3.3 /tmp 目录示例
ls -ld /tmp 常见显示: drwxrwxrwt
- 说明
/tmp对所有用户开放读写,但最后一个t使得只有文件属主能删除自己的文件。
四、应用与案例整合
¶1.合并特殊权限数字
若一个脚本需要 SUID + rwx (755) 则:
- SUID = 4
- rwx for owner, r-x for group/others = 755
- 合并 → 4755
同理,如果某目录要 SGID + rwxrwsr-x = 2775:
1 | chmod 2775 some_dir |
¶2.检查系统中的 SUID 程序
1 | find / -perm -4000 2>/dev/null |
- 定期审计可避免被不必要的 SUID 程序带来安全隐患。
¶3.安全小结
- SUID:常见于
passwd,sudo,mount,umount等关键程序,需谨慎管理。 - SGID:适用于共享目录。
- Sticky:防止公共写目录里文件被他人删除。
- 本文标题:Linux 文件权限
- 本文作者:Chen Kai
- 创建时间:2025-02-14 00:00:00
- 本文链接:https://www.chenk.top/Linux 文件权限/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!