1. Linux 权限模型
Linux 权限系统回答三个问题: 谁可以对什么文件做什么操作.
|
"其他人" 的含义: 不是 owner,也不在文件的 group 中的任何用户. root 是例外--内核对 root 的权限检查是特殊处理的.
文件 vs 目录的 rwx 含义
同一个字母 r,对文件和目录含义不同:
| 权限 | 对文件 | 对目录 |
|---|---|---|
r |
可以读取文件内容(cat/open) | 可以列出目录内容(ls) |
w |
可以修改文件内容 | 可以在目录中创建/删除文件 |
x |
可以作为程序执行 | 可以进入目录(cd)或访问目录内文件 |
最常见的困惑: 目录的 x 权限
对目录有 r 但没有 x: 能 ls 看到文件名,但读不了文件内容,进不了子目录.
对目录有 x 但没有 r: 能 cd 进去,能访问已知名字的文件,但不能 ls 列出有哪些文件.
权限检查顺序是: 先 x(能否进入目录),再 r(能否列出),最后检查文件自身的 rwx.
2. 读懂权限字符串
|
以 -rw-r--r-- 为例,10 个字符分 4 组:
|
| 位 | 含义 | 值 |
|---|---|---|
| 1 | 文件类型 | - 普通文件,d 目录,l 符号链接 |
| 2-4 | 所有者(owner) 权限 | rw- = 可读可写不可执行 |
| 5-7 | 所属组(group) 权限 | r-- = 只读 |
| 8-10 | 其他人(others) 权限 | r-- = 只读 |
|
3. chmod: 修改权限(符号模式)
chmod(change mode)修改文件的权限位. 符号模式用字母表达意图--最直观的学习方式.
| 谁(who) | 操作 | 权限 |
|---|---|---|
u = user(所有者) |
+ 添加 |
r 读 |
g = group(所属组) |
- 移除 |
w 写 |
o = others(其他人) |
= 精确设为 |
x 执行 |
a = all(以上三者) |
|
4. chmod: 八进制模式
符号模式直观但啰嗦. 日常更多用八进制(octal)--三位数字,一位对应一组权限. 这正是 chmod 755, chmod 644 的由来.
4.1 八进制速算表
每组的 rwx 三个位正好对应 3 个二进制位,一个八进制数字完美表达:
|
八进制权限就像三段密码锁--第一段设给 owner,第二段给 group,第三段给 others.
每段是一个 0-7 的数字.
不需要每次做二进制换算,记住三个就够了: 7(全开), 5(读+执行), 4(只读).
4.2 常用组合
| 八进制 | 符号等价 | 适用场景 |
|---|---|---|
755 |
rwxr-xr-x |
可执行文件/脚本,目录 |
644 |
rw-r--r-- |
普通文件(自己可写,别人只读) |
700 |
rwx------ |
私密脚本/SSH 密钥 |
600 |
rw------- |
私密数据文件(~/.ssh/id_rsa) |
777 |
rwxrwxrwx |
几乎绝对不要用--任何人都能修改 |
000 |
--------- |
临时锁定文件(只有 root 能改) |
|
chmod 777 是核按钮
chmod 777 让任何用户都可以读, 写, 执行这个文件. 在多用户服务器上,这意味着任何人都可以篡改或删除文件. 如果看到网上教程让用 chmod 777,停下来想一秒--真的需要 world-writable 吗? 大多数情况 755 或 644 就够了.
5. chown 与 chgrp: 修改归属
|
只有 root 能 chown--普通用户不能把自己的文件送给别人. 这是安全限制: 不能创建一个恶意 setuid 程序然后把所有者改成 root.
macOS 与 Linux 的差异
macOS 的 chown 在 user:group 语法上行为不一致,建议用 chown user file; chgrp group file 分两步,或直接用完整路径 chown user:staff file(在 macOS 上 staff 是默认用户组).
6. umask: 新文件的默认权限
当创建新文件时,权限不是随便给的. 系统用 umask(权限掩码)从 "最大允许权限" 中扣除一些位,得到新文件的默认权限.
|
| umask 值 | 新文件权限 | 新目录权限 |
|---|---|---|
022 |
644 (rw-r--r--) | 755 (rwxr-xr-x) |
002 |
664 (rw-rw-r--) | 775 (rwxrwxr-x) |
077 |
600 (rw-------) | 700 (rwx------) |
|
公式: 新文件权限 = 666 - umask(目录是 777 - umask). umask 的每一位 "扣除" 对应的权限: 022 扣掉 group 和 others 的写权限(w=2),让 group 和 others 只能读.
7. 特殊权限位
除了 rwx,Linux 还有三个特殊位. 日常不常用,但理解它们能解决很多 "为什么这个命令能工作" 的疑惑.
7.1 setuid(SUID) = 4xxx
当文件设置了 setuid 位,执行这个文件时,进程以文件所有者的身份运行,而不是以执行者的身份.
|
普通用户执行 passwd 时,进程以 root 身份运行--所以它能修改 /etc/shadow(密码文件,只有 root 可写). 这就是 passwd 和 sudo 不需要 root 登录就能提权的原因.
7.2 setgid(SGID) = 2xxx
对可执行文件: 进程以文件所属组的身份运行.
对目录: 在该目录下创建的新文件,自动继承目录的组(而不是创建者的默认组).
|
7.3 sticky bit = 1xxx
只能用于目录. 设置了 sticky bit 的目录中,只有文件所有者和 root 能删除文件--即使目录是 world-writable.
|
如果没有 sticky bit,任何人(因为 /tmp 是 777)都能删除别人的临时文件--这在多用户系统上会是一场灾难.
特殊位总结
| 八进制 | 名称 | 哪里出现 | 效果 |
|---|---|---|---|
| 4 | setuid (SUID) | owner 的 x 位 → s |
以文件所有者身份运行 |
| 2 | setgid (SGID) | group 的 x 位 → s |
文件: 以组身份运行; 目录: 新文件继承组 |
| 1 | sticky bit | others 的 x 位 → t |
只有文件所有者能删除 |
|
快速回顾
- 权限三要素: 谁(owner/group/others) x 什么操作(r/w/x). 文件与目录的 rwx 含义不同
- ls -l 输出:
-rwxr-xr-x= 类型 + owner x 3 + group x 3 + others x 3 - chmod u+x / chmod g-w 用符号表达意图; chmod 755 用八进制快速设好
- 记住三个八进制: 7(rwx 全开), 5(r-x 读+执行), 4(r-- 只读); 644 普通文件, 755 可执行/目录, 600 私密文件
- chown alice:staff file 改归属; 只有 root 能 chown
- umask 控制新文件的默认权限: 022 → 文件 644, 目录 755
- setuid(4xxx) = 以文件所有者身份运行(如 passwd); setgid(2xxx) = 目录中新文件继承组; sticky bit(1xxx) = 只有所有者能删除(如 /tmp)
动手练习
- 查找特殊权限位: 运行
ls -l /bin /usr/bin /tmp ~/.ssh,找找有没有 s 和 t 标志位 - 符号模式练习: 创建
test.sh(内容echo hello),用符号模式chmod u+x加执行,然后./test.sh运行 - 八进制模式练习: 用
chmod 644改回,再chmod 755加回--两种模式对比练习 - umask 实验: 运行
umask; touch a; ls -l a; rm a; umask 077; touch a; ls -l a,观察 umask 对新文件权限的影响 - sticky bit 含义: 检查
ls -ld /tmp--末尾的t是什么意思? 如果没有这个 t 会怎样?