umask显示当前 umask,新建文件目录的默认权限由它决定。
约 1180 字大约 4 分钟
2026-05-14
普通的 rwx 权限解释了“静态地,谁能做什么”。但还有两类机制管的是“动态”问题:新建的文件默认是什么权限(umask),以及程序运行时、目录共享时的特殊行为(suid / sgid / sticky)。它们出现频率不高,可一旦遇到,不懂就完全没头绪。
理解 umask 如何决定新建文件的默认权限,弄清 suid、sgid、sticky bit 各自解决什么问题。
umask显示当前 umask,新建文件目录的默认权限由它决定。
chmod u+s file运行该程序时临时获得文件属主的身份,极少自己设。
chmod g+s dir目录里新建的文件自动继承该目录的属组,适合共享目录。
chmod +t dir目录里的文件只有属主能删,/tmp 就是这样。
新建文件时,系统先有一个“最大可能权限”(文件 666、目录 777,都不含执行位给文件),再减掉 umask 里设置的位。常见 umask 是 022:
文件:666 - 022 = 644 → rw-r--r--
目录:777 - 022 = 755 → rwxr-xr-x所以“为什么我新建的文件别人能读”——因为 umask 没屏蔽 others 的 r。需要更私密,把 umask 设成 077(新文件直接 600,只有自己能读写)。改 umask 写进 ~/.bashrc 或服务的启动配置,临时改就直接 umask 077。
它们显示在 ls -l 权限位里,会“占用”原本 x 的位置:
| 位 | 设在哪 | 作用 | ls -l 表现 |
|---|---|---|---|
| suid | 可执行文件 | 运行时临时拥有文件属主的身份 | 属主位 x 变 s |
| sgid | 可执行文件 / 目录 | 文件:拥有属组身份;目录:新文件继承该目录的组 | 属组位 x 变 s |
| sticky | 目录 | 目录里的文件只有属主能删 | others 位 x 变 t |
suid 的经典例子是 /usr/bin/passwd:普通用户改密码要写 /etc/shadow(root 才能写的文件),靠的就是 passwd 带 suid,运行时临时变成 root。sgid 目录适合团队共享目录——大家在里面建的文件自动属于同一个组,互相能访问。sticky bit 让 /tmp 这种人人可写的目录不至于乱套:你能在里面建文件,但删不了别人的。
ls -l /usr/bin/passwd
# -rwsr-xr-x ← 属主位是 s,suid
ls -ld /tmp
# drwxrwxrwt ← 末尾是 t,sticky bit看到 s 或 t,就知道这个文件 / 目录有特殊行为,不是普通权限。
suid 是攻击者的重点目标
给一个程序加 suid(尤其是属主为 root 的),等于给它开了一条提权通道——程序里只要有漏洞,就可能被利用成 root。不要随意给脚本或自己的程序加 suid;定期用 find / -perm -4000 -type f 2>/dev/null 审查系统上有哪些 suid 文件,出现不认识的要警惕。共享目录优先用 sgid + 组权限解决,而不是放宽 others 权限。
| 误区 | 更稳妥的做法 |
|---|---|
| 新建文件权限不符合预期,逐个 chmod | 根因多半是 umask,改 umask 一劳永逸 |
| 给自己的脚本加 suid 图方便 | suid 是提权通道,几乎不该自己加;需要权限用 sudo 授权 |
共享目录靠 chmod 777 让大家都能用 | 用 sgid 目录 + 同一个组,既能共享又不过度开放 |
| 看到权限位里的 s、t 当成笔误 | s 是 suid/sgid,t 是 sticky,是特殊权限位的正常显示 |
版权归属:Shuo Liu