文件权限计算
勾选九位权限就能得到 755 这样的八进制,也可以把 ls -l 里的 -rwxr-xr-x 直接粘进来反向解析。setuid、setgid 和粘滞位都在。
| 角色 | 读 r = 4 | 写 w = 2 | 执行 x = 1 |
|---|---|---|---|
| 用户(u) 所有者 | |||
| 组(g) 同组用户 | |||
| 其他(o) 其他所有人 |
换算结果
755 rwxr-xr-x
每位权限分别代表什么
表格按「这是文件」来解释,切换上面那个开关看另一种说法。
| 角色 | 八进制 | 符号 | 能做什么 |
|---|---|---|---|
| 用户 所有者 | 7 | rwx | 读、写、执行 |
| 组 同组用户 | 5 | r-x | 读、执行 |
| 其他 其他所有人 | 5 | r-x | 读、执行 |
特殊位的开关状态
| 名称 | 状态 | 含义 |
|---|---|---|
| setuid | 未开启 | 执行时以文件所有者的身份运行,只对可执行文件有意义 |
| setgid | 未开启 | 执行时以文件所属组的身份运行;放在目录上表示新建文件继承该目录的组 |
| 粘滞位 | 未开启 | 放在目录上表示只有文件所有者和目录所有者能删除里面的文件,/tmp 就是 1777 |
常用权限速查
| 权限 | 符号 | 适用场景 |
|---|---|---|
| 644 | rw-r--r-- | 644 普通文件 · 所有者可读写,其他人只读,网页和配置文件最常用的默认值 |
| 755 | rwxr-xr-x | 755 目录或可执行文件 · 所有者全权限,其他人读和执行,最常用的目录权限 |
| 700 | rwx------ | 700 私有目录 · 只有自己能进,比如 ~/.ssh |
| 600 | rw------- | 600 私密文件 · 只有自己能读写,私钥必须用这个 |
| 400 | r-------- | 400 只读文件 · 连自己都不能改,用于防止误改的配置 |
| 664 | rw-rw-r-- | 664 团队共享文件 · 同组可以改写,常用于共享目录里的文件 |
| 775 | rwxrwxr-x | 775 团队共享目录 · 同组可以增删改,配合 setgid 让新建文件继承组 |
| 4755 | rwsr-xr-x | 4755 setuid 可执行文件 · 普通用户执行时临时拿到所有者权限,能做提权漏洞,慎用 |
| 1777 | rwxrwxrwt | 1777 粘滞位目录 · 所有人可写但只能删自己的文件,/tmp 就是这个 |
| 777 | rwxrwxrwx | 777 全开 · 任何人都能改写和替换,生产环境里基本等于把文件交出去 |
八进制和符号怎么对应
权限分三组:用户(u)、组(g)、其他(o),每组三位,读是 4、写是 2、执行是 1,加起来就是 0 到 7 的一个数字。所以 755 拆开是 7、5、5,也就是 rwxr-xr-x:用户能读写执行,组和其他人能读和执行,但改不了。
三位八进制每位都是 0 到 7 的取值,再加上 setuid / setgid / 粘滞位这三位,一共 4096 种组合。本页是按全量组合验证过换算的:八进制、九位符号、ls -l 的权限列三种写法互相转换结果一致。
目录上的执行位是「进入」而不是「运行」
这是最容易踩的坑。文件上的 x 表示可执行,目录上的 x 表示能进入这个目录、能访问里面的文件。所以一个目录只有 r 没有 x 时,你能看到文件名列表却打不开其中任何一个文件。上面那个「这是一个目录」开关会把解释换成目录口径。
删除文件看的是父目录的写权限,和文件自己的权限无关。这也是「目录设 555 防止误删,但里面文件还是能被同目录下有写权限的人删掉」的原因——真要防删,得把父目录的写权限收掉。
特殊位
setuid(4):可执行文件被任何人运行时,都以文件所有者的身份运行,passwd 就靠它让普通用户改自己的密码。但它也是提权漏洞的常见来源,能不用就不用。
setgid(2):写在可执行文件上是切换所属组;写在目录上则是「这个目录里新建的文件继承目录的组」,团队共享目录配 2775 是标准写法,能省掉成员之间组不一致的麻烦。
粘滞位(1):只对目录有意义,加了之后即使目录是 777,也只有文件所有者和目录所有者能删里面的文件,/tmp 就是 1777。
符号上的大小写有讲究:s 表示「同时有执行位」,S 表示「有 setuid 但没有执行位」——后者其实没有效果。t 和 T 同理。所以看到 -----S--- 这种写法,说明 setuid 设了但漏了执行位,属于配置失误。
为什么不该图省事用 777
777 意味着任何能登录这台机器的人都能改写、替换、甚至插入可执行内容。上传目录用 777 是很多入侵的第一步,Web 服务器被写进一句话木马基本都是这个原因。目录正常用 755,需要写权限的目录用 775 加组,真的必须让上传目录可写时,至少配 733 加粘滞位,并让运行用户和上传用户分开。
顺便说一句 umask:新建文件的权限是「默认权限减去 umask」,常见 umask 是 022,于是文件默认 644、目录默认 755。所以临时改权限之后,别人新建的文件还是老样子,需要改的是 umask 而不是事后补 chmod。
粘贴 ls -l 的输出时注意什么
反向解析能直接吃 -rwxr-xr-x、drwxr-xr-x 这种带类型字符的写法,并会按开头的 d 或 - 自动切换上面的「目录/文件」开关;也能吃 u=rwx,g=rx,o=rx 这种子句。但 + 和 - 开头的相对写法(比如 a+x、go-w)在这里只能按「从 0 开始」计算,因为本页不知道文件当前的权限——真实 chmod 是在现有权限上加减的。要精确结果,用 = 子句或直接填八进制。