Linux 文件权限:rwx、chmod、chown 与数字权限
Linux 的文件权限
Linux 的基本文件权限按所有者、所属组和其他用户三类划分。权限由进程的有效身份及所属组参与判定,不是只看当前终端显示的用户名;ACL、挂载选项和安全模块还可能施加额外限制。
ls -l 通常用第一个字符表示文件类型,后续九个字符表示三组基本权限;末尾可能还有 ACL 等附加标记。以下分别说明:
表示文件的类型
- | 普通文件 |
|---|---|
d | 目录 |
l | 符号链接,指向另一路径 |
用户组类型
| 缩写 | 用户组 | 类型 |
|---|---|---|
u | owner | 文件所有者适用的权限 |
g | group | 属于文件所属组的用户适用的权限 |
o | other | 不属于前两类的用户适用的权限 |
权限
r:Read读w:Write写x:execute执行
文件只在需要直接执行时添加执行权限,二进制程序和带解释器声明的脚本都可能需要 x。例如运行 ./script.sh 要求执行权限;运行 sh script.sh 则由 Shell 读取脚本,通常要求读取权限。目录的 x 表示搜索或穿越权限。
针对文件和目录来说,r、w、x 有不同的作用:
| 权限 | 普通文件 | 目录 |
|---|---|---|
r | 读取内容 | 列出目录中的文件名 |
w | 修改内容 | 配合目录的 x 创建、删除或重命名目录项,还可能受 sticky bit 限制 |
x | 尝试将文件作为程序执行 | 穿越目录或访问已知名称的目录项,文件内容还需相应文件权限 |
因此,删除文件主要取决于父目录的权限,不等同于文件本身是否可写。
TIP
root 通常有绕过基本读写权限的能力,但并非可以绕过所有限制,例如只读挂载、安全模块或网络文件系统的服务端权限。Linux 上直接执行普通文件通常仍要求至少一个执行位已设置;通过解释器读取脚本属于另一条操作路径。
| 权限项 | 文件类型 | 文件所有者 | 文件所属组用户 | 其他用户 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 | 执行 | ||
| 字符表示 | (d|l|c|s|p) | (r) | (w) | (x) | (r) | (w) | (x) | (r) | (w) | (x) |
| 数字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | |
仅考虑基本 rwx 位时:进程身份匹配文件所有者就使用 owner 这一组;否则若属于文件的所属组(包括附加组)就使用 group;其余使用 other。匹配到一类后,不会因为该类权限不足而继续从 other 借用权限;存在 ACL 时还要结合 ACL 判定。
修改文件权限
chmod 修改权限位,chown 修改所有者或所属组。两者不能相互替代。
| 命令 | 作用与权限要求 |
|---|---|
chmod | 修改权限,通常要求是文件所有者或具有相应特权 |
chown | 更改所有者通常需要管理员权限;所有者仅在允许范围内更改所属组 |
例如,将文件交给指定用户和组前,先确认这两个身份存在:
sh
ls -l example.txt
id alice
getent group developers
sudo chown alice:developers example.txt
ls -l example.txtalice、developers 和文件名是示例,需替换;不要在不清楚目录内容时直接递归修改系统目录。
mode 方式
text
chmod [ugoa][+-=][rwxX] 文件who | u 所有者、g 所属组、o 其他用户、a 三类全部 |
|---|---|
opt | + 添加某个权限 - 取消某个权限 = 赋予权限 |
per | r w x X |
示例:
bash
chmod u+x script.sh # 只给所有者增加执行权限
chmod go-w example.txt # 去掉组和其他用户的写权限
chmod u=rw,go=r example.txt # 明确设置为 rw-r--r--+ 增加、- 移除、= 指定所选类别的权限。省略 u/g/o/a 时会受 umask 影响;需要明确操作全部类别时写 a。大写 X 只在目录或已有任一执行位的文件上设置执行权限,常用于区分目录与普通数据文件。
数字方式设置权限
命令语法
使用数字方式修改文件权限的基本语法如下:
sh
chmod 640 example.txt三位八进制数字依次表示所有者、所属组、其他用户;每一位由读 4、写 2、执行 1 相加。这里的 640 是所有者可读写、组只读、其他用户无权限;不是给原权限逐项累加。
权限对应关系表
| 权限 | 数字值 | 权限总和 |
|---|---|---|
rwx | 4+2+1 | 7 |
rw- | 4+2+0 | 6 |
r-- | 4+0+0 | 4 |
0表示无权限1表示执行权限(x)2表示写权限(w)4表示读权限(r)
权限示例
以下是说明权限拆解的示意输出,不是需要执行的命令:
text
-rwxr--r-- 1 alice developers 10 Oct 16 02:55 script.sh| 权限类别 | 权限字符串 | 数值拆解 | 权限总和 |
|---|---|---|---|
| 用户权限 | rwx | 4+2+1 | 7 |
| 用户组权限 | r-- | 4+0+0 | 4 |
| 其他用户权限 | r-- | 4+0+0 | 4 |
权限组合示例:744
代表用户拥有读、写、执行权限,组和其他用户只有读权限。
修改权限示例
先用 ls -l 查看现状,再选择符号方式增减特定位,或用数字方式直接设定完整权限。示例不意味着所有文件都应该开放给其他用户执行。
权限组合结果:765
sh
chmod 765 script.sh
ls -l script.sh结果为 rwxrw-r-x:所有者 7、组 6、其他用户 5。从 744 变为 765,是给组增加写权限、给其他用户增加执行权限,所有者权限不变。实际程序、数据文件与目录应按用途选择权限,不需要统一设置为 765。
Linux 学习路径
权限操作会直接影响文件命令的结果,可先对照 Linux 文件操作;继续排查程序与资源占用时,可阅读 Linux 进程管理。