踩过无数坑后,我总结了这份 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/ls、a.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 → touch、rm 失败
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

为什么会是 644 和 755?这里就轮到 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 033 和 umask 003 对新建文件权限有区别吗?
答: 有区别。普通文件最大权限是 666:

umask 033 → 666 & ~033 = 666 & 0744 = 0644(rw-r–r–)
umask 003 → 666 & ~003 = 666 & 0774 = 0664(rw-rw-r–)
033 屏蔽了所有者的写权限和组/其他的读写权限,而 003 只屏蔽了其他人的写权限。所以 033 更安全,003 更开放。
————————————————
版权声明:本文为CSDN博主「say_fall」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/say_fall/article/details/160634957

上一篇 Python命令
下一篇 OpenClaw 性能优化指南:低配服务器也能流畅运行