一、十位字符拆成四段
-rwxr-xr-x 1 root root 4096 Nov 3 10:00 deploy.sh
│└┬┘└┬┘└┬┘
│ │ │ └── 其他人(other)
│ │ └───── 所属组(group)
│ └──────── 所有者(user)
└────────── 文件类型:- 普通文件、d 目录、l 链接、s 套接字
每组三位固定是 r(读=4)、w(写=2)、x(执行=1),没有该权限就是 -。所以 rwxr-xr-x = 755。
二、数字怎么来的
三位相加就是该组的权限值:
| 符号 | 数字 | 含义(文件) | 含义(目录) |
|---|---|---|---|
| r | 4 | 读取内容 | 列出目录内文件名(ls) |
| w | 2 | 修改内容 | 在目录内创建/删除文件 |
| x | 1 | 执行(脚本/程序) | 进入目录(cd)、访问其中文件 |
755 = rwxr-xr-x:所有者可读写执行,组和其他人可读可执行。 644 = rw-r--r--:所有者可读写,其他人只读。
常用组合:
chmod 644 file.txt # 普通文件
chmod 755 script.sh # 可执行脚本、目录
chmod 600 id_rsa # 私钥,只有自己能读写
chmod 700 ~/.ssh # 目录,只有自己能进
三、目录的 x 权限最容易被忽略
这是新手最常困惑的地方:
- 目录有
r无x:能ls看到文件名,但打不开、读不到内容。 - 目录有
x无r:不能ls列表,但知道确切路径就能访问里面的文件。 - 目录要能
cd进去、能访问其中文件,必须有x。
所以「网页 403」时,除了看文件权限,还要看从根到该文件的每一级目录是否都有 x。
四、chmod 的两种写法
chmod 755 file # 数字(八进制)
chmod u+x file # 符号:给所有者加执行
chmod go-w file # 去掉组和其他的写权限
chmod -R 755 dir # 递归(慎用,会把文件也变成可执行)
递归改目录时更稳的做法是分开处理:
find dir -type d -exec chmod 755 {} \;
find dir -type f -exec chmod 644 {} \;
五、umask:新建文件的默认权限
新建文件的权限 = 666 - umask,新建目录 = 777 - umask。常见 umask 022 意味着新文件是 644、新目录是 755。用 umask 命令查看当前值,在 /etc/profile 或服务配置里可以改。
六、三个特殊位
- 粘滞位(1xxx,如
/tmp的 1777):目录内文件只有所有者能删,防止别人删你的临时文件。 - setuid(4xxx):执行时以文件所有者身份运行,
/usr/bin/passwd就是典型。滥用是提权风险。 - setgid(2xxx):目录上设置后,新建文件继承目录的属组,团队协作目录常用。
七、Permission denied 排查顺序
ls -l看文件权限和属主属组。namei -l /path/to/file一次性看整条路径每级目录的权限——这是最快的定位方式。- 确认当前用户是谁(
id),是否在对应组里。 - 检查 SELinux/AppArmor(
getenforce),以及挂载是否带noexec。 - 脚本报「权限不够」但已经是 755,看 shebang 和文件系统挂载选项。
小结
三位一组、r=4 w=2 x=1;目录的 x 决定能不能进;私钥 600、目录 700、脚本 755、普通文件 644;递归改权限要分开处理文件和目录。