AxionserveSign in / RegisterEnglish/中文/cn繁体/tw

第 2 课 · 文件与权限:属主、模式、umask 的现实含义

Linux 基础 · L1 · 第 2 / 6 节 · 约 3 分钟

「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 把防线前移。