在 Linux 常用命令学习笔记(用户管理篇) 里,我们把"谁在操作、有哪些组、权限主体是谁"讲明白了------文件有属主(user)、有属组(group),新建文件默认属组是你的主组。但那一篇结尾我打了个包票:"那一串
-rw-r--r--到底是什么意思?怎么用chmod/chown/chgrp改?"今天就来兑现。权限管理,是 Linux"一切皆文件"哲学下最硬核、也最容易翻车的一环。改对了,系统井井有条;改错了,一句
chmod -R 777能把安全防线直接拆光。这篇从"看懂权限字符串"一路讲到"特殊权限位(SUID / SGID / 粘滞位)"和"进程权限 UID",一次讲透。读完你会发现:所谓权限,本质就是"用户/组 + 三种操作(rwx)+ 作用在文件/目录上的差异"三件事的组合。先把这套组合拳练熟,你才算真正摸到了 Linux 系统管理的门把手。
前情回顾:本篇要"接"上哪些旧工具
| 之前学过的 | 本篇怎么接上它 |
|---|---|
ls -l / ls -la(基础篇、用户管理篇) |
本篇教你怎么看懂 那串 drwxr-xr-x,并重点讲清"目录的执行位 x"和"文件的执行位"区别 |
| 文件属主 / 属组(用户管理篇) | 本篇用 chown / chgrp 改它们,并讲清属主 / 属组 / 其他人三组权限各管谁 |
sudo(用户管理篇) |
改文件所有者、设 SUID 常需 sudo,本篇处处会用到 |
| Vim / Emacs(高级篇) | 改文件内容前先确认权限够不够;本篇提醒:别拿编辑器去硬改 /etc/passwd,要用专用命令 |
记住一个核心心法:权限 = 对"谁"(u/g/o)授予"什么操作"(r/w/x)。先认人(用户管理篇),再授权(本篇)。
一、文件权限
当我们用 ls -l 以详细格式列出文件,第一列那串字符就是权限。先来看个例子:
$ ls -l Desktop/
drwxr-xr-x 2 pete penguins 4096 Dec 1 11:45 .
我们重点关注第一列 drwxr-xr-x。它其实由四部分组成:
-
第 1 个字符:文件类型 。
d表示这是一个目录 (Directory);普通文件是-;符号链接是l,等等。 -
后面 9 个字符:权限 ,分成三组、每组三个,对应"用户 / 组 / 其他人":
d | rwx | r-x | r-x
| 用户 | 组 | 其他人
每组里的字符含义固定:
| 字符 | 含义 | 字符 | 含义 |
|---|---|---|---|
r |
读(Read) | - |
不授予该权限 |
w |
写(Write) | ||
x |
执行(Execute) |
关键差异:文件的
xvs 目录的x
对文件 :
x表示"可以把这个文件当程序运行"。对目录 :
x表示"可以cd进入这个目录、访问其中的文件"。一个目录如果没有x,哪怕你有r(能列出文件名),也进不去、打不开里面的文件。
三组权限分别作用于不同层级:
-
用户(所有者,user) :第一组
rwx,作用于文件的主人。上面例子里主人是pete,他拥有读、写、执行全权限。 -
组(group) :第二组
r-x,作用于和文件关联的组penguins。组里的人能读、能进,但不能写。 -
其他人(others) :第三组
r-x,作用于系统上所有其他用户。他们同样能读、能进,不能写。
二、修改权限
要改权限,主力命令是 chmod (change mode)。它提供两种模式:**符号模式和数字(八进制)模式**。
2.1 符号模式
用字母表示"改谁"和"怎么改":
-
u= user(所有者)、g= group(组)、o= others(其他人)、a= all(全部) -
+添加权限、-移除权限、=直接设定chmod u+x myfile # 给"用户"添加执行权限
chmod g-w myfile # 把"组"的写权限移除
chmod ug+w myfile # 同时给用户和组添加写权限
chmod a=r myfile # 所有人只保留读权限(= 直接设定)
2.2 数字(八进制)模式
把权限用三个数字一次设完,每位对应"用户 / 组 / 其他人":
| 数字 | 含义 | 组成 |
|---|---|---|
4 |
读(r) | |
2 |
写(w) | |
1 |
执行(x) | |
7 |
rwx | 4+2+1 |
5 |
r-x | 4+0+1 |
6 |
rw- | 4+2+0 |
chmod 755 myfile
拆解 755:
-
7(用户) :
4+2+1→rwx -
5(组) :
4+0+1→r-x -
5(其他人) :
4+0+1→r-x
2.3 安全红线:别碰 777
大坑警告 :
chmod -R 777 /some/directory是新手最常见的危险操作之一。它给所有人 完全的读、写、执行权限,等于把敏感文件敞开给任何本地用户。永远遵循最小权限原则------只给确实必要的权限。
三、chown 与 chgrp
光改权限不够,有时还得改"这份文件归谁"。这就用到 chown (change owner)和 chgrp (change group)。改你不拥有的文件,通常需要 sudo。
sudo chown patty myfile # 把文件所有者改成用户 patty
sudo chgrp whales myfile # 把文件所属组改成 whales
sudo chown patty:whales myfile # 一步同时改用户和组(用户名:组名)
小技巧:
chown用冒号:隔开用户和组,一次搞定两者,是日常最常用写法。
四、umask
每个新建文件都有一组默认权限。想改这套默认值,用 umask。它用的也是三位数字权限集,但含义相反------umask 是"移除"这些权限,而不是"添加"。
umask 021
上面表示:新文件的默认权限里,用户全给、组移除写(2)、其他人移除执行(1)。大多数发行版默认 umask 是 022:用户完全访问,组和其他人没有写权限。
注意:
umask只在当前 shell 会话有效。想永久生效,要把它写进启动文件(如.profile)------这点留到后面的 shell 课程再展开。
五、Setuid(SUID)
有时普通用户需要临时"提权"干点事------总不能每次都让管理员来输 root 密码。SUID 就是干这个的:设置了 SUID 的文件,运行它的人会暂时获得"该文件所有者"的权限(通常就是 root)。
最经典的例子是改密码:
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1134 Dec 1 11:45 /etc/shadow # 只有 root 能读
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 47032 Dec 1 11:45 /usr/bin/passwd # 注意那个 s!
/usr/bin/passwd 的权限里出现了一个新位 s ,这就是 SUID。当你运行 passwd,你其实是以 root 身份 在改 /etc/shadow,所以普通用户也能改自己密码。
修改 SUID 同样有两种写法:
sudo chmod u+s myfile # 符号模式
sudo chmod 4755 myfile # 数字模式:4 代表 SUID,前置
你会看到有时 SUID 显示成大写
S------意思是"设了 SUID 但没有执行位",作用和s一样,只是这份文件本身不能被直接执行。
六、Setgid(SGID)
和 SUID 类似,SGID 让程序以"该文件所属组"的身份运行 。权限位出现在组那一组里:
$ ls -l /usr/bin/wall
-rwxr-sr-x 1 root tty 19024 Dec 14 11:45 /usr/bin/wall # 组权限里的 s
修改 SGID:
sudo chmod g+s myfile # 符号模式
sudo chmod 2555 myfile # 数字模式:2 代表 SGID,前置
七、进程权
SUID 讲完,引出一个更深层的问题。你用 SUID 的 passwd 跑起来时,确实暂时是 root 了------那是不是就能顺手改 Sally 的密码?答案是不能 ,因为 Linux 给每个进程维护了三种 UID:
| UID 类型 | 含义 |
|---|---|
| 有效 UID(effective UID) | 进程当前"以谁的身份"访问资源。决定权限判定的就是它 |
| 真实 UID(real UID) | 真正启动这个进程的用户的 ID,用来追溯"是谁干的" |
| 保存 UID(saved UID) | 允许进程在"有效 UID"和"真实 UID"之间来回切换,避免一直以高权限运行 |
把 passwd 串起来看:
-
你(UID 500)运行程序,真实 UID = 500;
-
因为
passwd有 SUID,有效 UID 被提成了文件所有者 root 的 UID = 0; -
所以进程能以 root 身份读写
/etc/shadow------你能改自己的密码; -
但你想改 Sally(UID 600)的密码时,进程还记得你的真实 UID 是 500,不是 root 授权的"改任何人"操作,于是被拒。
一句话:SUID 只是临时借你文件主人的身份去访问资源,并没有把"你是谁"抹掉。 大多数时候真实 UID 和有效 UID 相同,只有在
passwd这类特例里才会分离。
八、粘滞位
最后一个特殊权限位------粘滞位 ,专门用在目录 上。设了粘滞位的目录,里面的文件只有文件所有者、目录所有者或 root 才能删除/重命名,其他人就算对该目录有写权限也动不了别人的文件。
最常见的例子就是 /tmp:
$ ls -ld /tmp
drwxrwxrwt 17 root root 4096 Dec 15 11:45 /tmp # 末尾的 t 就是粘滞位
任何用户都能在 /tmp 建文件(全员可写),但不能删除别人的文件------这正是粘滞位在保护。
设置粘滞位:
chmod +t my_shared_dir # 符号模式
chmod 1755 my_shared_dir # 数字模式:1 代表粘滞位,前置(rwxr-xr-x + t)
九、特殊权限位速查表
把三种特殊权限位和数字表示放一起,方便记忆:
| 特殊位 | 数字 | 出现位置 | 作用 |
|---|---|---|---|
| SUID | 4 |
用户组(第 1 位) | 运行文件时获得文件所有者的权限 |
| SGID | 2 |
组(第 2 位) | 运行文件时获得文件所属组的权限 |
| 粘滞位 | 1 |
其他人(第 3 位) | 目录内文件只能由所有者/root 删除 |
所以一个完整的四位权限码(如
4755、2755、1755)就是"特殊位 + 普通三位"。
小结
这一篇,我们把"文件权限"这根线彻底拉通了:
-
权限字符串 :
drwxr-xr-x= 文件类型 + 用户/组/其他人三组 rwx;目录的x是"能进",文件的x是"能运行"; -
chmod 两种写法 :符号模式(
u+x/g-w,直观)和数字模式(755,省事);**红线是别碰777**; -
chown / chgrp :改属主、改属组,冒号写法一步到位,记得加
sudo; -
umask :新文件默认权限的"减法",默认
022; -
三大特殊位:SUID(4,借所有者身份)、SGID(2,借组身份)、粘滞位(1,共享目录各删各的);
-
进程权限 :真实/有效/保存三种 UID,解释了为什么
passwd能改自己密码却动不了别人的。
回看整个 Linux 命令系列:基础篇 摸单兵命令(ls/cat/whoami)→ 进阶篇 用管道和文本工具批量处理 → 高级篇 用正则 + Vim/Emacs 精修文件 → 用户管理篇 搞清"谁在操作、有哪些组"→ 本篇 给文件分配读写执行、守住系统安全。五篇连起来,Linux 命令行的能力版图才算真正闭环。
如果在练手时想有个能随手敲命令的环境,前面几篇都推荐过的 Linux Journey(https://labex.io/linuxjourney) 同样适合本篇:网页里就能实操 chmod、chown、翻 /etc/passwd,边学边练印象最深。
📎 Linux 学习系列 · 全部文章
如果这篇对你有帮助,欢迎点赞、收藏、关注,你的支持是我继续整理下去的动力~ 下一篇打算聊"进程"(了解系统上正在运行的那些进程),关注本博客,我们进阶路上见。