Linux 权限详解:谁能改、谁能删,一篇讲明白
一、先搞懂一个关键:有权限 ≠ 能执行
在 Linux 里,哪怕给了你“执行权限”,也不一定能运行文件——得满足两个条件:
能执行 = 是可执行文件 + 有执行权限
比如 .out
后缀的文件是编译后的可执行文件,但像 whb.txt
这种文本文件,就算给了执行权限也没用(本质就不是能跑的程序)。看这张图,whb.txt
明确标了“文本文件”,根本没法执行:
二、Linux 里的“三类身份”:谁能操作文件?
Linux 用三种身份控制文件权限,简单说就是“归谁、跟谁一伙、其他人”:
- user(所属者):文件的“主人”,比如你创建的文件,你就是所属者;
- group(所属组):相当于“小组”,组里的人共享同一套权限;
- other(其他者):既不是主人,也不在小组里的人,权限最严格。
判断权限时,Linux 会按“所属者 → 所属组 → 其他者”的顺序对比,只匹配一次。比如你是文件主人,就只看 user 的权限,不管组和其他者。
三、权限的“三种动作”:读、写、执行
不管是哪种身份,权限都分三种,用字母表示很直观:
r
(read):读权限,能看文件内容、列目录里的文件;w
(write):写权限,能改文件内容、在目录里增删文件;x
(execute):执行权限,能运行可执行文件、进入目录。
看这两张图,左边是权限字母的含义,右边是实际文件的权限展示(比如 rw-r--r--
就是“所属者能读能写,组和其他人只能读”):
四、修改权限的核心命令
1. 改所属组:chgrp
想把文件的“所属组”换成另一个组,用 chgrp
命令。注意:只有 root 或文件主人能改,普通用户得加 sudo
提权。
比如把 test.txt
的所属组改成 users
组,命令是:
# 普通用户用 sudo 提权
sudo chgrp users test.txt
# 要是 root 账号,直接输
chgrp users test.txt
看这张图,执行命令后,文件的所属组确实变了:
2. 改权限:chmod(字母/数字两种方式)
chmod
是修改权限的核心命令,有两种常用方式:用字母(直观)或数字(简洁)。
先讲数字方式:八进制权限
计算机只认 0 和 1,所以把 r/w/x
转换成二进制(有权限是 1,没权限是 0):
r
= 100(二进制)= 4(十进制)w
= 010(二进制)= 2(十进制)x
= 001(二进制)= 1(十进制)
三种权限的组合就是“加起来的数字”,比如 rw-
是 4+2=6,r-x
是 4+1=5。因为每个身份(user/group/other)的权限最大是 7(4+2+1),所以用 3 位八进制数表示权限(第一位 user,第二位 group,第三位 other)。
看这张图,二进制和数字的对应关系很清楚:
![[…/…/…/…/…/attchment/Pasted image 20250812094720.png]]
![[…/…/…/…/…/attchment/Pasted image 20250812094814.png]]
比如 644
权限,就是“user 能读能写(6=4+2),group 和 other 只能读(4)”。用 chmod
修改时,直接输数字:
# 把 test.txt 权限改成 644
chmod 644 test.txt
看这张图,执行命令后,权限确实变成了 rw-r--r--
(对应 644):
3. 改所属者:chown
想换文件的“主人”,用 chown
命令。和 chgrp
一样,需要 root 权限,普通用户加 sudo
。
命令格式:chown 新所属者 文件名
,比如把 test.txt
的主人改成 maxue
:
sudo chown maxue test.txt
还能同时改所属者和所属组,用“所属者:所属组”的格式:
# 把 test.txt 的主人改成 maxue,所属组改成 users
sudo chown maxue:users test.txt
看这张图,红色框是新所属者,绿色框是新所属组,一次就改好了:
五、容易踩坑的 3 个权限问题
1. 目录权限:和文件不一样!
目录的 r/w/x
权限含义和文件完全不同,记准这三点:
- 要进入目录,必须有 x 权限(没 x 连
cd
都进不去); - 要查看目录里的文件(比如 ls),必须有 r 权限(没 r 只能看到自己知道的文件名);
- 要在目录里增删文件/改文件名,必须有 w 权限(没 w 只能看,不能改)。
看这三张图,分别是没 r、没 w、没 x 的效果:
2. 缺省权限:新建文件/目录的默认权限是咋来的?
你有没有发现:新建普通文件默认权限是 644
,新建目录默认是 755
?这是“起始权限”和“权限掩码(umask)”共同决定的。
核心规则:
最终默认权限 = 起始权限 & (~umask)(& 是按位与,~ 是按位取反)
- 普通文件起始权限:
666
(rw-rw-rw-) - 目录起始权限:
777
(rwxrwxrwx) - 默认 umask 是
002
(只影响 other 的 w 权限)
举个例子:普通文件最终权限 = 666 & (~002) = 664。
如果想改默认权限,直接改 umask 就行,比如把 umask 改成 022
(让 group 和 other 都没 w 权限):
# 临时生效(重启终端后失效)
umask 022
# 永久生效(编辑 ~/.bashrc,加一行 umask 022,然后 source ~/.bashrc)
echo "umask 022" >> ~/.bashrc
source ~/.bashrc
看这张图,改完 umask 后,新建文件的权限确实变了:
3. 粘滞位:解决共享目录的“删文件”问题
Linux 多用户是隔离的,但有时候需要共享文件(比如团队共用一个目录)。这时候会遇到一个坑:
就算你没有文件的 w 权限,只要有目录的 w 权限,就能删掉别人的文件!
为了避免这种情况,Linux 引入了“粘滞位(t)”——给目录加了粘滞位后,只有文件主人、目录主人、root 能删这个文件,其他人就算有目录 w 权限也删不了。
怎么加粘滞位?
用 chmod
加 t
权限,数字方式是在三位权限前加 1
(比如 1777
):
# 给共享目录 share 加粘滞位
sudo chmod +t share # 字母方式,直观
# 或
sudo chmod 1777 share # 数字方式,1 代表粘滞位
看这张图,加了粘滞位后,目录权限最后一位变成了 t
:
![[…/…/…/…/…/attchment/Pasted image 20250812103927.png]]
注意:粘滞位只能给目录加,给普通文件加没用。Linux 系统自带的 /tmp
目录(临时文件共享目录),默认就有粘滞位,就是为了防止别人乱删文件。
- 点赞
- 收藏
- 关注作者
评论(0)