Linux权限完全指南:从"能"与"不能"到深度理解

在这里插入图片描述

🌈 say-fall:个人主页
🚀 专栏:《系统深入Linux操作系统》
💪 格言:做好你自己,才能吸引更多人,与他们共赢,这才是最好的成长方式。

📝 前言

相信很多刚接触 Linux 的同学都有过这样的经历:兴冲冲地在服务器上敲了一堆命令,结果发现——别人的文件我删不了、我自己的文件别人改不了、公共目录里的文件莫名其妙被人清空了……

一头问号:Linux 里的"权限"到底是怎么回事?

别急,这篇文章就是来帮你把权限从"玄学"变成"明码标价"的操作手册。通过本文,你将掌握:

技能 应用场景
理解 owner/group/other 三层权限结构 判断任意文件谁能访问、谁不能访问
熟练使用 chmod 命令 修改文件或目录的读/写/执行权限
掌握 chown/chgrp 命令 更改文件的所有者和所属组
理解 umask 掩码机制 理解新建文件为什么"偏偏"少了某个权限
掌握 粘滞位(Sticky Bit) 解决"/tmp 目录被人误删文件"的困惑

🔍 核心问题: Linux 是多用户操作系统,多人共用一台机器——那么"你的文件凭什么你能动,别人的文件你动不了"?答案就在权限系统里。


一、🌲 为什么需要权限?

说个真实的场景:你们实验室有一台 Linux 服务器,账号 common 给了 10 个同学共用。

某天,张三在 /home/common/project 下写了一个重要代码,结果李四随手 rm -rf * 把整个目录清空了……

如果没有权限保护,数据就这么没了。权限系统的核心价值就两个字——隔离

  • 隔离用户:每个人只能操作属于自己的文件,不能随便动别人的东西
  • 隔离系统:普通用户不能修改系统关键文件,防止把整个系统搞崩
  • 隔离责任:谁的文件谁负责,出了问题能追溯到人

💡 换个角度理解: 权限就像是 Linux 世界里的"门锁"——你手里的钥匙(权限)决定了你能不能打开某扇门(文件/目录)。


二、👥 Linux 中的两类用户

Linux 下把用户分为两类:

用户类型 说明 命令提示符
超级用户(root) Linux 系统的"上帝账号",可以做任何事情,不受任何限制 #
普通用户 受限账号,只能操作自己拥有的文件,部分系统命令无法执行 $

使用 su 命令可以切换用户:

# 从普通用户切换到 root(会提示输入 root 密码)
[user@localhost ~]$ su root
Password: 
[root@localhost ~]# 

# 从 root 切回普通用户
[root@localhost ~]$ su user
[user@localhost ~]$ 

2.1 🔥 sudo:普通用户临时"升权"

每次都 su root 切来切去很麻烦,而且直接用 root 账号万一手滑……

sudo(super user do)让普通用户可以临时以 root 身份执行特定命令,前提是管理员已经在配置文件中给你开了白名单。

⚠️ 注意: 不是所有普通用户都能用 sudo,必须先通过 root 手动配置 /etc/sudoers 文件。


三、🔢 权限的三层结构

当我们执行 ls -l 查看文件详情时,第一眼看到的 10 个字符就代表了权限信息:

[user@localhost ~]$ ls -l
drwxr-xr-x  3 root root 4096 Jan 11 15:01 dir/
-rw-rw-r--  1 root root    0 Jan 11 14:22 file.txt

drwxr-xr-x 为例,拆解一下:

d  rwx  r-x  r-x
│  ───  ───  ───
│   │    │    │
│   │    │    └── other(其他用户):读+执行
│   │    └─────── group(所属组用户):读+执行
│   └──────────── owner(所有者):读+写+执行
└───────────────── 文件类型:d=目录,-=普通文件

3.1 三类访问者

身份 符号 含义
owner u 文件或目录的所有者——文件的"主人"
group g 文件所属组内成员——和主人同组的人
other o 其他所有用户——除了以上两类之外的人

💡 优先级规则: 判断一个用户能否访问某文件时,Linux 按照 owner → group → other 的顺序依次检查,命中即停,不再往下匹配。而且只匹配一次身份,例如虽然张三是所属组内部成员,但是系统先确定他是所有者以后张三就和所属组权限无关了。

3.2 权限的三位一体:rwx

每个身份位上有三个权限位:

权限 字符 数值 对文件的含义 对目录的含义
r 4 读取文件内容 查看目录下的文件列表(ls)
w 2 修改文件内容 在目录中创建/删除文件
执行 x 1 运行文件(程序/脚本) 进入目录(cd)

⚠️ 容易踩坑的地方: 目录的"执行权限"不是指"运行目录",而是指"能不能把目录作为工作目录",也就是能不能 cd 进去。

3.3 文件类型字符

ls -l 输出的第一个字符表示文件类型:

字符 类型 例子
d 目录 /home
- 普通文件 /bin/lsa.txt
l 符号链接(软链接) 类似 Windows 快捷方式
b 块设备文件 硬盘、光驱等
c 字符设备文件 屏幕、键盘等串口设备
p 管道文件 进程间通信
s 套接字文件 网络/进程通信

💡 记住常见三种就够了: d(目录)、-(普通文件)、l(链接)。其余四种是设备/通信类文件,日常很少直接操作。


四、🛠️ chmod:给文件上锁/开锁

chmod(change mode)用来修改文件或目录的访问权限。只有文件所有者和 root 才能修改权限。

4.1 符号模式:直观但啰嗦

+-= 符号来增减权限,身份用 u/g/o/a 表示:

# 格式:chmod 身份+/-/=权限 文件

# 给文件所有者加上执行权限
[user@localhost ~]$ chmod u+x script.sh

# 给所属组去掉写权限
[user@localhost ~]$ chmod g-w important.txt

# 设置其他用户只有读权限(覆盖原有)
[user@localhost ~]$ chmod o=r read_only.txt

# 一次性设置所有身份(a = all)
[user@localhost ~]$ chmod a+x run.sh    # 所有人都能执行
[user@localhost ~]$ chmod go-rwx secret  # 组和其他人都移除读写执行

符号对照表:

符号 含义
u owner,所有者
g group,所属组
o other,其他用户
a all,所有人(u+g+o)
+ 增加权限
- 移除权限
= 覆盖权限

4.2 八进制模式:简洁高效

每个权限位对应一个数字,三组叠加就是最终权限:

rwx = 4 + 2 + 1 = 7  (全部权限)
r-x = 4 + 0 + 1 = 5  (读+执行)
rw- = 4 + 2 + 0 = 6  (读+写)
r-- = 4 + 0 + 0 = 4  (只读)
--- = 0 + 0 + 0 = 0  (无任何权限)
# 格式:chmod 三位八进制数 文件

# 755 = rwxr-xr-x(所有者全部,组和其他读+执行)
[user@localhost ~]$ chmod 755 public_dir/

# 644 = rw-r--r--(所有者读写,组和其他只读)
[user@localhost ~]$ chmod 644 notes.txt

# 600 = rw-------(只有所有者能读写,权限最高)
[user@localhost ~]$ chmod 600 private.key

# 700 = rwx------(只有所有者能访问)
[user@localhost ~]$ chmod 700 secret_dir/

💡 实战建议: 日常改权限优先用八进制——一个数字说清楚所有权限,一目了然。符号模式适合做"微调"(只改某个身份、某个权限位)。

4.3 递归修改:chmod -R

如果要给整个目录及里面所有文件统一设权限,用 -R(recursive):

# 将 /home/user/project 整个目录树设为 755
[user@localhost ~]$ chmod -R 755 /home/user/project/

# ⚠️ 注意:递归会作用于所有子目录和文件,有时需要配合 find 精确控制

五、👤 chown 与 chgrp:文件归属

光有读写执行权限还不够,还得知道"这个文件归谁管"——这就是 所有者(owner)所属组(group) 的职责。

5.1 chown:修改所有者

# 格式:chown 用户名 文件

# 将 file.txt 的所有者改为 user1
[user@localhost ~]$ chown user1 file.txt

# 递归修改整个目录
[user@localhost ~]$ chown -R user1 /home/user/project/

5.2 chgrp:修改所属组

# 格式:chgrp 组名 文件

# 将 file.txt 的所属组改为 developers
[user@localhost ~]$ chgrp developers file.txt

# 递归修改
[user@localhost ~]$ chgrp -R developers /home/user/shared/

5.3 一条命令搞定两者:chown

# chown 也能同时改所有者和所属组,用冒号分隔
[user@localhost ~]$ chown user1:developers file.txt

# 如果只改所属组(不改动所有者)
[user@localhost ~]$ chown :developers file.txt

⚠️ 注意: 只有 root 能任意修改文件的所有者,普通用户可以将文件改为自己所在的组,但改不了别人的文件。


六、📂 目录权限的特殊性

目录的 rwx 和文件的含义有很大区别,这里必须单独讲清楚。

6.1 目录的 rwx 三重含义

权限 对目录的效果 实验验证
r(读) 可以 ls 查看目录内容 ❌ 无 r → ls 报 Permission denied
w(写) 可以在目录内 创建/删除/重命名 文件 ❌ 无 w → touchrm 失败
x(执行) 可以 cd 进入目录 ❌ 无 x → cd 报 Permission denied
# 实验:只有 r 没有 x 的目录
[user@localhost ~]$ chmod 444 testdir/     # r--r--r--
[user@localhost ~]$ ls testdir/
ls: cannot access 'testdir/file.txt': Permission denied
# 能看到文件名列表,但无法查看文件详情!
total 0
-????????? ? ? ? ?            ? file.txt

# 实验:只有 x 没有 r 的目录
[user@localhost ~]$ chmod 111 testdir/     # --x--x--x
[user@localhost ~]$ ls testdir/
ls: cannot access 'testdir': Permission denied
[user@localhost ~]$ cd testdir/           # 但 cd 可以!
[user@localhost testdir]$ 

6.2 关键结论

⚠️ 目录没有 x 权限,连 r 都没用——你甚至不知道自己进不去哪个目录。

权限组合 能 cd 进去? 能 ls 查看? 能创建/删除文件?
r-- ✅(但看到文件都是???)
-w-
--x
r-x ✅(正常查看)
rwx

6.3 目录写权限的危险性

有个经典"坑":

张三在 /home/shared 下建了个文件,李四登录后把它删了——明明那文件不是李四的!

原因:/home/shared 目录本身对所有人是 rwx(777),所以只要有目录的写权限,任何人都能删除里面的文件——不管那个文件是不是自己的。

解决方案就是下一节要讲的——粘滞位


七、🔒 umask:权限的"隐形过滤器"

你有没有想过:新建一个文件时,默认权限是怎么来的?

7.1 默认权限

# 新建普通文件
[user@localhost ~]$ touch newfile.txt
[user@localhost ~]$ ls -l newfile.txt
-rw-r--r--  1 user user  0 Jan 11 15:00 newfile.txt    # 644

# 新建目录
[user@localhost ~]$ mkdir newdir
[user@localhost ~]$ ls -ld newdir
drwxr-xr-x  2 user user 4096 Jan 11 15:00 newdir/      # 755

为什么会是 644755?这里就轮到 umask 出场了。

7.2 umask 的作用

umask(user file creation mask)是"权限掩码"——系统用它来屏蔽(减掉)新建文件不该有的权限。

类型 理论最大权限 umask 掩码 最终权限
普通文件 666 (rw-rw-rw-) 022 644 (rw-r–r–)
目录 777 (rwxrwxrwx) 022 755 (rwxr-xr-x)

💡 为什么普通文件默认没有执行权限? 因为文件能不能执行取决于文件内容(是否是可执行程序),不应该由创建时自动赋予。新建一个普通文本就带执行权限,显然不合理。

7.3 查看和修改 umask

# 查看当前 umask 值
[user@localhost ~]$ umask
0022

# 临时修改(只对当前 session 有效)
[user@localhost ~]$ umask 002   # 新建文件变成 664,目录变成 775
[user@localhost ~]$ umask 077   # 私有模式,新建文件只有自己能用

💡 安全建议: 在多用户服务器上,建议普通用户把 umask 设为 077,这样新建的文件只有自己能访问,其他人完全无法窥探。


八、🩹 粘滞位:目录的最后一道防线

终于到了解决"李四删了张三文件"问题的关键。

8.1 问题复现

[root@localhost ~]$ chmod 0777 /home/shared/    # 为了"方便共享"把权限开到最大
[root@localhost ~]$ ls -ld /home/shared/
drwxrwxrwx. 3 root root 4096 Jan 11 15:58 /home/shared/

[root@localhost ~]$ touch /home/shared/zhang.txt  # 张三创建了文件

[root@localhost ~]$ su - lisi                    # 切换到李四
[lisi@localhost ~]$ rm /home/shared/zhang.txt    # 李四居然能删掉?!
rm: 是否删除有写保护的普通空文件 "/home/shared/zhang.txt"? y
# 成功了!张三的文件被李四删了……

8.2 解决方案:粘滞位(Sticky Bit)

粘滞位的作用:有了粘滞位,目录里的文件只能被"主人"删除,其他人无法删除别人的文件。

# 给目录加上粘滞位:chmod +t 目录
[root@localhost ~]$ chmod +t /home/shared/
[root@localhost ~]$ ls -ld /home/shared/
drwxrwxrwt. 3 root root 4096 Jan 11 16:00 /home/shared/
#                        ↑
#                     多了个 t(小写t表示有执行权限+x + 粘滞位)
#                     如果没有x则是大写T

加上粘滞位后再试试:

[lisi@localhost ~]$ rm /home/shared/zhang.txt
rm: 无法删除 "/home/shared/zhang.txt": 不允许的操作
# ✅ 终于删不动了!

8.3 粘滞位的删除规则

当一个目录设置了粘滞位(chmod +t)后,该目录下的文件只能被以下三类人删除:

身份 能否删除
root ✅ 可以(系统管理员)
目录的所有者 ✅ 可以(/home/shared 的主人)
文件的所有者 ✅ 可以(张三删自己的文件)
其他普通用户 ❌ 不可以(李四无权删张三的文件)

💡 粘滞位的典型应用场景: /tmp 目录——所有用户都能在 /tmp 下创建临时文件,但只能删自己的,不能删别人的。

8.4 粘滞位权限的八进制表示

粘滞位属于"特殊权限位",用八进制表示时放在常规权限的前面(第四位):

# 目录设置 rwxrwxrwt:755 + 1 = 1755
[root@localhost ~]$ chmod 1777 /home/shared/

# 去掉粘滞位
[root@localhost ~]$ chmod -t /home/shared/
特殊权限 八进制 效果
粘滞位(Sticky Bit) 1 目录下的文件只能所有者删除
SGID 2 目录内新建文件自动继承组
SUID 4 任何用户运行文件时以所有者身份运行

九、📊 权限总结速查表

场景 推荐命令 说明
修改文件权限(数字) chmod 644 file.txt 最常用,简单直接
修改目录权限(递归) chmod -R 755 dir/ 目录及内部所有文件
修改所有者 chown user file.txt 需要 root
同时改所有者和组 chown user:group file.txt 一条搞定
修改所属组 chgrp group file.txt 同上
设置共享目录 chmod 1777 /shared/ 粘滞位 + 全权限
临时提高权限 sudo command 普通用户执行系统命令
查看 umask umask 看当前掩码值
安全 umask umask 077 私有模式,推荐

十、🤔 几个思考题

学完本文,来试试回答这些问题:

1️⃣ 为什么 chmod 000 file.txt 之后 root 依然能读写该文件?

答: 超级用户(root)在 Linux 中的权限是无限制的,几乎不受任何权限位约束。即使文件权限设为 ----------(000),root 依然可以读取、修改、删除、执行。这是因为 root 是系统的最高管理员,需要能够修复任何问题。如果真的想让 root 也无法访问某个文件,需要通过其他机制(如 ACL、SELinux 等)。

💡 延伸思考:反过来,如果你是普通用户,即使文件权限是 777,别人也无法访问你的文件——因为没有你的用户名和密码,根本登录不进来。权限系统和登录系统是两道独立的门。

2️⃣ 目录权限是 r-- 时,为什么 ls 能看到文件名但看不到详细信息?

答: 目录的"读权限(r)"允许读取目录的数据块——也就是目录里存着的文件名和 inode 编号的映射表。所以 ls 能列出文件名。但"执行权限(x)"控制的是元数据访问,没有 x,ls -l 无法通过 inode 获取文件的属性信息(大小、时间、权限等),所以只能看到文件名,详细信息全是问号。

3️⃣ umask 033umask 003 对新建文件权限有区别吗?

答: 有区别。普通文件最大权限是 666:

  • umask 033666 & ~033 = 666 & 0744 = 0644(rw-r–r–)
  • umask 003666 & ~003 = 666 & 0774 = 0664(rw-rw-r–)

033 屏蔽了所有者的写权限和组/其他的读写权限,而 003 只屏蔽了其他人的写权限。所以 033 更安全,003 更开放。


✅ 本节完…

📝 作者:say-fall | 编辑:say-fall | 🌟 原创不易,如果对你有帮助,记得 👍 点赞 + ⭐ 收藏 哦!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐