第 2 课 · 文件与权限:属主、模式、umask 的现实含义
「Permission denied」是新手遇到最多的报错——它不是系统刁难你,是权限模型在正常工作。这一课把 ls -l 那一串符号彻底讲透:谁拥有文件、三组人各能做什么、数字模式怎么算、umask 为什么决定你新建文件的默认权限。
读懂 ls -l:一行信息的全解
ls -l /etc/passwd
# -rw-r--r-- 1 root root 1.9K Oct 1 12:00 /etc/passwd
# │└──┬───┘ │ │ │ │ └─ 修改时间 └─ 文件名
# │ │ │ │ └─ 大小
# │ │ │ └─ 属组(group)
# │ │ └─ 属主(owner)
# │ └─ 硬链接数
# └─ 类型+权限:- 普通文件 / d 目录 / l 软链接
# rw- r-- r-- 三组权限:属主 / 属组 / 其他人
三组九位,每组三个字符:r(读)、w(写)、x(执行),- 表示没有。对文件:r=能看内容、w=能改内容、x=能当程序运行;对目录:r=能列清单、w=能在里面增删文件、x=能进入(cd)——目录缺 x 时连 cd 都进不去,这是新手最容易困惑的点。
数字模式:八进制的算术
r=4、w=2、x=1,三位相加得每组的数字:7=rwx、6=rw-、5=r-x、4=r--、0=---。三组连写就是常见模式:
| 模式 | 含义 | 典型用途 |
|---|---|---|
| 644 | 属主可读写,其他人只读 | 配置文件、网页文件的默认 |
| 755 | 属主全权,其他人读+执行 | 目录与脚本的默认 |
| 600 | 只有属主可读写 | SSH 私钥、凭据文件(强制要求) |
| 400 | 只有属主可读 | 更严的密钥保护 |
| 777 | 所有人全权 | ⚠️ 几乎永远是错误答案(任何人可改可执行) |
chmod 644 文件 # 数字模式设置
chmod u+x 脚本.sh # 符号模式:给属主(u)加执行权
chown www-data:www-data 目录 # 改属主与属组(需要 sudo)
stat 文件 # 完整元数据:权限的八进制/属主/时间戳一目了然
umask:默认权限的减法
你新建的文件为什么是 644 而不是 666?因为 umask——它是「默认权限的掩码」:新文件的基础权限 666、新目录 777,减去 umask 的值才是实际权限。常见 umask 022:666−022=644、777−022=755。root 会话常用 022,部分发行版普通用户是 002(组内可写)。
umask # 查看当前掩码
umask 077 # 本会话收紧:新建文件 600、目录 700(多用户机器的好习惯)
现实含义:在共享主机或多人服务器上,umask 077 让你误放的敏感文件默认就是「只有自己能读」——防线前移到创建那一刻。
三个高频权限事故
- SSH 私钥权限太宽:私钥文件若是 644,ssh 会直接拒绝使用(「permissions are too open」)——
chmod 600 ~/.ssh/id_ed25519是标准修复; - 脚本没有执行位:./script.sh 报 Permission denied——要么
chmod +x script.sh,要么换bash script.sh(用解释器跑不需要执行位); - chown -R 777 一把梭:网站报错就全网 777 是最危险的偏方——正确做法是让 Web 服务用户(www-data 类)成为文件属主或属组,权限保持 644/755。
验证练习
# ① 找到你机器上所有「其他人可写」的文件(潜在风险面):
find /etc /home -xdev -type f -perm -o+w 2>/dev/null | head
# ② 找到所有 SUID 文件(以属主权限运行的特殊位,提权审计的重点):
find / -xdev -type f -perm -4000 2>/dev/null | head
# ③ 给自己建一个 600 的笔记文件并验证别人读不了:
echo test > ~/note.txt && chmod 600 ~/note.txt && ls -l ~/note.txt
属组与多人协作:权限的组织学
属组(group)是权限的批量管理单位:把需要共同访问某目录的人放进同一个组,目录属组设成它、权限给组内读写——比逐人开 ACL 干净得多。常用操作:groups 用户名 看某人属于哪些组、groupadd 组名 建组、usermod -aG 组名 用户名 把人加进组(-aG 缺一不可,少了 -a 会把人从其他组里踢出去——高频事故)、chgrp -R 组名 目录 批量改属组。协作目录的推荐组合:目录 2775(下一节讲 setgid 的作用)+ 成员同组 + umask 002——三人以上共用一台机器时值得十分钟配好。
特殊权限位:setuid、setgid、sticky 入门
三组九位之外还有三个特殊位,认识它们主要是为了审计时认得出危险信号:setuid(4)——程序以文件属主的权限运行而非执行者,passwd 命令靠它才能改 /etc/shadow;也是提权攻击的头号目标,所以上一节练习里让你 find -perm -4000 盘点它们——清单应当短且每个都能说出用途;setgid(2)——对目录的意义最实用:目录设了 setgid,里面新建的文件自动继承目录的属组(协作目录的粘合剂);sticky(1)——对目录生效:/tmp 就是 1777,人人可写但只有文件的属主能删自己的文件。三个位的数字加在模式最前面(4755/2775/1777),ls -l 里显示为 x 位的 s 或 t 字母。日常原则:不主动给 setuid,见到不认识 setuid 文件要警惕。
本节小结
- 三组九位:属主/属组/其他人 × 读/写/执行——目录的 x 是「能进入」;
- 数字模式是 r4w2x1 的加法:644 文件、755 目录脚本、600 密钥,777 几乎永远错;
- umask 决定新建文件的默认权限,多人环境用 077 把防线前移。