缘博客
发布日期

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 位分为三组,每组三位对应 rwx

rwx r-x r-x
用户  组  其他人

- 表示该位置没有对应权限。例如:

r-x

表示有读和执行权限,但没有写权限。

某些系统会在权限字符串后额外显示 .+ 等标记,例如 -rw-------.。它们通常提示 SELinux 安全上下文或扩展 ACL 存在,不属于前面介绍的十位基础权限本身。

权限判断顺序

当用户访问一个文件时,系统会先看他是否就是文件所属用户;不是才看他是否属于所属用户组;两者都不是时才使用最后三位“其他用户”权限。

因此,不能只看最后三位就断言某个用户一定能或不能访问。必须先确认该用户是否属于文件所有者或所属组:

ls -l 文件名
id 用户名

rwx 对文件和目录的不同含义

rwx 分别代表 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 的字符写法

字符写法通过 ugo 指定要修改哪一类对象:

标记代表
uuser,所属用户
ggroup,所属用户组
oother,其他用户

课件使用 = 直接设置每一类的权限:

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--xx
2-w-w
3-wxw + x
4r--r
5r-xr + x
6rw-r + w
7rwxr + 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,而不是只背常见的 755644


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

chmodchown 的区别

命令改变什么
chmod权限位,例如 rwxr-xr-x755
chown所属用户和所属用户组

它们经常一起出现,但不是同一件事。即使一个目录权限设置正确,归属到错误用户或组仍可能导致预期用户无法访问;反过来,归属正确但权限过严也会阻止访问。


权限排查顺序

遇到“Permission denied”时,不要立刻用 sudochmod 777。可以按下面顺序判断:

1. pwd:确认当前操作位置
2. ls -l:查看目标的权限、所属用户、所属组
3. id:确认当前用户的 UID、主组和附加组
4. 判断命中了 user、group 还是 other 三组权限
5. 再决定是否需要 chmod、chown 或加入用户组

chmod 777 会把所有用户都赋予读、写、执行权限,虽然可能临时“解决问题”,却很容易制造更严重的安全问题。理解权限字符串和所有权,才能用最小范围修复访问问题。

上一篇:Linux用户和权限(一):超级用户与账号管理