文件权限计算

勾选九位权限就能得到 755 这样的八进制,也可以把 ls -l 里的 -rwxr-xr-x 直接粘进来反向解析。setuid、setgid 和粘滞位都在。

勾选每个角色的读、写、执行权限
角色读 r = 4写 w = 2执行 x = 1
用户(u) 所有者
组(g) 同组用户
其他(o) 其他所有人

八进制和符号怎么对应

权限分三组:用户(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 是在现有权限上加减的。要精确结果,用 = 子句或直接填八进制。