前言
刚接触 Linux 的同学,第一次看到 ls -l 输出前面那串 drwxr-xr-x 大概率是一脸懵的。这篇文章把 Linux 文件权限这套模型掰开揉碎讲清楚,包括很多人用了很多年也没完全理解的特殊权限位。
一、基础权限:rwx 三元组
ls -l 看一个文件:
-rw-r--r-- 1 root root 1024 Mar 5 10:00 app.conf
第一个字符之后的 9 个字符,每 3 个一组,分别对应:
| 位置 | 含义 | 英文 |
|---|---|---|
| 1-3 | 所有者权限 | owner / user |
| 4-6 | 所属组权限 | group |
| 7-9 | 其他人权限 | others |
每个三元组里三种权限的含义:
r(read,读):文件可读内容;目录可列出里面的条目w(write,写):文件可修改;目录可在其中创建/删除条目x(execute,执行):文件可执行;目录可进入(cd)
⚠️ 注意一个反直觉的点:对目录而言,
x权限比r更关键。没有x你连cd都进不去,即使有r也只能看到文件名列表。
二、数字表示法
三种权限对应二进制位:
r = 4 (100)
w = 2 (010)
x = 1 (001)
所以 rwxr-xr-- = 4+2+1 / 4+0+1 / 4+0+0 = 754。
常见组合速查:
| 数字 | 字母 | 含义 |
|---|---|---|
| 755 | rwxr-xr-x | 目录、可执行程序的标准权限 |
| 644 | rw-r–r– | 普通文件的标准权限 |
| 600 | rw——- | 私密文件(如 ~/.ssh/id_rsa) |
| 777 | rwxrwxrwx | 全开(生产环境慎用!) |
修改权限:
# 数字法
chmod 755 deploy.sh
# 符号法:给其他人加执行权限
chmod o+x deploy.sh
# 递归修改目录
chmod -R 755 /var/www/html
三、所有权:chown 与 chgrp
# 同时修改所有者和组
chown nginx:nginx /var/www/html/favicon.ico
# 只改组
chgrp docker /var/run/docker.sock
# 递归
chown -R www-data:www-data /opt/app
四、特殊权限位
前面 ls -l 的第一个字符如果出现 s 或 t,就说明特殊权限登场了。
4.1 SUID(Set UID)
出现在所有者的 x 位上(-rwsr-xr-x)。作用:普通用户执行该文件时,临时获得文件所有者的身份。
最典型的例子:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root ... /usr/bin/passwd
普通用户执行 passwd 修改自己的密码,但 /etc/shadow 只有 root 能写——靠的就是 SUID 让进程临时持有 root 权限。
# 设置/去除 SUID
chmod u+s file
chmod 4755 file # 4 开头表示 SUID
chmod u-s file
4.2 SGID(Set GID)
用在可执行文件上:执行者临时获得文件所属组的身份。
用在目录上更常见:目录下新建的文件,自动继承目录的属组(而不是创建者的主组)。团队共享目录的经典配置:
mkdir /data/share
chgrp devops /data/share
chmod 2775 /data/share # 2 开头表示 SGID
4.3 Sticky Bit
出现在其他人的 x 位上(drwxrwxrwt)。作用:目录内的文件,只有所有者(和 root)能删除,即使目录对所有人可写。
最经典的就是 /tmp:
$ ls -ld /tmp
drwxrwxrwt 15 root root ... /tmp
所有人都能往里写,但 A 用户删不掉 B 用户的文件。
五、一个综合练习
需求:搭建一个团队共享目录 /data/project,要求——
- 属于
dev组 - 组内成员可读写,其他人无权限
- 新建文件自动归入
dev组
groupadd dev
mkdir -p /data/project
chgrp dev /data/project
chmod 2770 /data/project
验证:
# 用两个组内用户分别创建文件
sudo -u alice touch /data/project/a.txt
sudo -u bob touch /data/project/b.txt
ls -l /data/project
# 两个文件属组都是 dev, 且互相可编辑
六、安全提醒
- 生产环境禁止无脑
chmod 777,这是很多安全扫描的第一条告警 - 定期排查系统里的 SUID 文件,防止被利用提权:
find / -perm -4000 -type f 2>/dev/null
- 敏感私钥文件务必
600,目录700:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
小结
| 权限 | 数字前缀 | 字母位置 | 核心作用 |
|---|---|---|---|
| SUID | 4 | owner 的 x 位 | 执行时获得所有者身份 |
| SGID | 2 | group 的 x 位 | 目录内文件继承属组 |
| Sticky | 1 | others 的 x 位 | 仅所有者可删除文件 |
权限模型是 Linux 一切安全体系的基石,把这篇文章的内容吃透,后续学容器、学 K8s 里的 runAsUser、fsGroup 时会发现全是同一套思想的延伸。
本文是「Linux 基础」系列第 1 篇,下一篇:Python 环境搭建与虚拟环境管理。