- 发布日期
Linux用户和权限(二):文件权限、chmod 与 chown
- 作者
- 姓名
- 缘
- 社交账号
文章目录
从 ls -l 读懂权限信息
在 Linux 中执行:
ls -l
会以详细列表显示文件信息。示例:
drwxr-xr-x 2 alice developers 4096 Sep 4 20:00 project
其中最值得先掌握的三部分是:
drwxr-xr-x alice developers
↑ ↑ ↑
权限字符串 所属用户 所属用户组
这意味着 Linux 会按“文件所属用户、文件所属用户组、其他用户”三个层级判断能否进行相应操作。
十位权限字符串的结构
drwxr-xr-x 一共 10 个位置:
d rwx r-x r-x
↑ ↑ ↑ ↑
│ │ │ └─ 其他用户权限(other)
│ │ └───── 所属用户组权限(group)
│ └───────── 所属用户权限(user)
└──────────── 文件类型
第一位表示类型:
| 首字符 | 含义 |
|---|---|
d | 目录(directory) |
- | 普通文件 |
l | 符号链接(symbolic link) |
后面 9 位分为三组,每组三位对应 r、w、x:
rwx r-x r-x
用户 组 其他人
- 表示该位置没有对应权限。例如:
r-x
表示有读和执行权限,但没有写权限。
某些系统会在权限字符串后额外显示 .、+ 等标记,例如 -rw-------.。它们通常提示 SELinux 安全上下文或扩展 ACL 存在,不属于前面介绍的十位基础权限本身。
权限判断顺序
当用户访问一个文件时,系统会先看他是否就是文件所属用户;不是才看他是否属于所属用户组;两者都不是时才使用最后三位“其他用户”权限。
因此,不能只看最后三位就断言某个用户一定能或不能访问。必须先确认该用户是否属于文件所有者或所属组:
ls -l 文件名
id 用户名
r、w、x 对文件和目录的不同含义
r、w、x 分别代表 read、write、execute,但它们作用在文件与目录上时并不完全相同。
| 权限 | 对普通文件的含义 | 对目录的含义 |
|---|---|---|
r | 可以查看文件内容 | 可以查看目录中的名称列表,例如执行 ls |
w | 可以修改文件内容 | 可以在目录中创建、删除、重命名文件或子目录 |
x | 可以把文件作为程序执行 | 可以进入目录,例如 cd 目录名 |
这几个差异很重要。
文件上的权限
r-- 可以读内容,不能修改,不能作为程序执行
rw- 可以读写,不能作为程序执行
r-x 可以读和执行,不能修改
rwx 可以读写和执行
目录上的权限
对目录而言,x 往往被称为“可进入”权限。一个目录只有 r 而没有 x 时,用户可能看到目录名列表,却不能真正通过 cd 进入或访问内部路径。
w 控制的是目录条目本身,因此删除一个文件通常取决于所在目录是否可写,而不只取决于那个文件本身是否可写。
chmod:修改权限位
chmod 用于修改文件或目录的权限。只有文件/目录的所属用户或 root 才能修改其权限。
基础形式可以理解为:
chmod [-R] 权限表达式 文件或目录
-R 表示递归处理目录内的所有内容:
chmod -R 权限表达式 目录名
递归修改会同时影响大量文件。对源码、配置、可执行文件混用的目录,不应不加区分地套用同一种权限;先确认目录内容和目标权限是否合理。
chmod 的字符写法
字符写法通过 u、g、o 指定要修改哪一类对象:
| 标记 | 代表 |
|---|---|
u | user,所属用户 |
g | group,所属用户组 |
o | other,其他用户 |
课件使用 = 直接设置每一类的权限:
chmod u=rwx,g=rx,o=x hello.txt
这条命令把 hello.txt 设为:
rwxr-x--x
分解来看:
u=rwx 所属用户拥有 r、w、x
g=rx 所属用户组拥有 r、x
o=x 其他用户只有 x
递归应用到目录:
chmod -R u=rwx,g=rx,o=x test
它会把 test 及其内部所有项目都设为同一组权限。学习时可以这样理解,但实际项目中目录通常需要 x 才能进入,普通数据文件却未必需要 x。因此生产环境最好分别为目录和文件设置合理权限。
chmod 的数字写法
权限也可以用三个数字表示:
chmod 三位数字 文件或目录
三位数字依次代表:
用户权限 用户组权限 其他用户权限
数字来自权限值相加:
r = 4
w = 2
x = 1
完整对照表:
| 数字 | 权限字符串 | 组成 |
|---|---|---|
0 | --- | 无权限 |
1 | --x | x |
2 | -w- | w |
3 | -wx | w + x |
4 | r-- | r |
5 | r-x | r + x |
6 | rw- | r + w |
7 | rwx | r + w + x |
例如:
chmod 751 hello.txt
751 可以拆为:
7 5 1
rwx r-x --x
也就是所属用户 rwx、所属组 r-x、其他用户 --x。
课件中的更多例子:
# r-x --x r-x
chmod 515 hello.txt
# -wx -w- rw-
chmod 326 hello.txt
# --x -w- -wx
chmod 123 hello.txt
数字写法适合快速精确设置;前提是能把每个数字还原成 rwx,而不是只背常见的 755、644。
chown:修改所属用户和所属组
权限位回答“谁能做什么”,所有权回答“文件属于谁、哪个组”。chown 用于修改文件或目录的所属用户和所属组。
普通用户不能把文件随意改为其他用户或组的资产,因此这条命令通常只由 root 执行,或使用 sudo:
sudo chown ...
基础形式:
chown [-R] [用户][:用户组] 文件或目录
其中:
| 形式 | 含义 |
|---|---|
用户 文件 | 只修改所属用户 |
:用户组 文件 | 只修改所属用户组 |
用户:用户组 文件 | 同时修改用户和用户组 |
-R | 对目录及内部内容递归应用 |
示例:
# 只把所属用户改为 root
chown root hello.txt
# 只把所属用户组改为 root
chown :root hello.txt
# 所属用户改为 root,所属组改为 itheima
chown root:itheima hello.txt
# 递归把 test 目录及内部内容的所属用户改为 root
chown -R root test
修改后用 ls -l 验证:
ls -l hello.txt
chmod 和 chown 的区别
| 命令 | 改变什么 |
|---|---|
chmod | 权限位,例如 rwxr-xr-x 或 755 |
chown | 所属用户和所属用户组 |
它们经常一起出现,但不是同一件事。即使一个目录权限设置正确,归属到错误用户或组仍可能导致预期用户无法访问;反过来,归属正确但权限过严也会阻止访问。
权限排查顺序
遇到“Permission denied”时,不要立刻用 sudo 或 chmod 777。可以按下面顺序判断:
1. pwd:确认当前操作位置
2. ls -l:查看目标的权限、所属用户、所属组
3. id:确认当前用户的 UID、主组和附加组
4. 判断命中了 user、group 还是 other 三组权限
5. 再决定是否需要 chmod、chown 或加入用户组
chmod 777 会把所有用户都赋予读、写、执行权限,虽然可能临时“解决问题”,却很容易制造更严重的安全问题。理解权限字符串和所有权,才能用最小范围修复访问问题。