前言

刚接触 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,要求——

  1. 属于 dev 组
  2. 组内成员可读写,其他人无权限
  3. 新建文件自动归入 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 环境搭建与虚拟环境管理。