在使用ls -l命令输出的结果中,其10位权限字符串里,第1位用于表明文件类型,像“-”代表普通文件,“d”则表示目录。而后边的9位权限字符,每3位为一组,它们依次对应的是所有者、所属组以及其他用户对于该文件或目录的读(r)、写(w)、执行(x)权限。

用 ls -l 看清 10 位权限字符串
直接运行 ls -l filename 命令,输出的第一列就是你需要的权限位,总共10个字符。例如 -rw-r--r-- ,其中第1位表示文件类型,后面9位分为三组,每组3个字符,分别对应所有者(u)、所属组(g)、其他用户(o)的 r(读)、w(写)、x(执行)状态。
常见陷阱:
- 误把第 1 位当权限:它是文件类型标识,
-是普通文件,d是目录,l是软链接,和权限无关 - 忽略第 11 位的点(
.):它表示 SELinux 上下文启用,不是权限位,但会影响实际访问行为 - 看到
?或空白:说明当前用户无权读取该 inode 的权限字段(比如被 ACL 或强制访问控制拦截),此时ls -l显示不完整
stat 输出里找八进制和符号权限的原始值
stat 不依赖 shell 解析,直接从 inode 读取权限数据,更可靠。运行 stat filename,在 “Access” 行能看到两套表示:
例如:Access: (0644/-rw-r--r--)Uid: ( 1000/user) Gid: ( 1000/user)
其中 0644 是八进制权限值,-rw-r--r-- 是符号表示,二者严格等价。注意前导 0 表示八进制,不是“十进制 644”。
实用技巧:
- 用
stat -c "%a %A" filename只提取权限数字和符号,适合脚本处理 - 目录的
x权限在stat输出中和文件一样显示为x,但它实际作用是“能否cd进入”,不是“能否执行” - 如果
stat显示Access: (0000/----------),说明权限被 mask 或 ACL 完全屏蔽,ls -l可能仍显示部分符号(误导性)
区分 rwx 在文件和目录中的真实含义
同一权限字符,在文件和目录上效果完全不同,这是最容易出错的地方:
- 对普通文件:
r= 能cat/head内容;w= 能echo/vim修改内容;x= 能当作程序执行(如./script.sh) - 对目录:
r= 能ls列出文件名(不包含子项属性);w= 能touch/rm目录内文件(需配合x);x= 能cd进入、能访问子项的元数据(如stat subfile) - 单独有
r没x的目录:你能看到文件名,但ls -l subfile会报Permission denied - 单独有
x没r的目录:你不能ls,但若已知文件名,可以cat known_file(前提是文件本身权限允许)
权限位被 ACL 或 setuid 影响时怎么确认真实状态
当文件设置了 ACL(getfacl 可见)或特殊位(如 setuid),ls -l 的第 3 组权限位可能被修改(比如 rwx 变成 rws),但这些变化不改变底层 9 位权限值。
关键判断点:
- 看到
s或S(如-rwsr-xr-x):说明设置了 setuid(s)或 setgid(目录中常见s),此时第 3 位x被替换成s,但权限数值不变(仍是 4755) - 看到
+(如-rw-rw-r--+):表示存在 ACL,仅靠ls -l看不到全部权限,必须用getfacl filename查看扩展规则 stat的Access字段始终显示基础权限(不含 ACL),而getfacl才反映最终生效策略
真正决定访问是否成功的,是内核在 open()/execve() 时综合基础权限 + ACL + capability + SELinux 等多层检查的结果,单看 ls -l 的 10 位只是起点。