Linux权限管理
AI速览:这篇笔记详细介绍了 Linux 文件权限管理的基础知识和常用命令,并提供了丰富的示例,方便读者理解和实践。通过学习这篇笔记,可以掌握如何查看、修改文件权限,以及如何管理文件的所有者和所属组,设置文件权限掩码。
初识Linux权限管理
前置需求:
- 拥有至少一台Linux虚拟机或云服务器皆可
- 具有一定的编程基础
- 了解Linux基础命令,会使用vim编辑文件
- 善于向AI求助的头脑
我会尽可能地让本篇文章的每一个步骤都具有可操作性,建议大家一起操作以保证印象更深刻。
准备工作
首先,打开你的Linux系统虚拟机或云服务器,你应该能看到类似如下的页面:
找一个你心仪的位置,创建一个文件夹,这个文件夹内就是接下来的我们要操作的位置。
笔者比较懒,心仪的位置就决定在家目录了,文件夹就叫mydir。
创建目录mkdir(make directory):
1 | mkdir mydir |
接着输入cd(change directory)切换到我们刚刚创建的文件夹里:
1 | cd mydir |
使用touch,创建一些文件,我们将在这些文件中初探Linux的权限管理,我这里把它命名为a.txt,b.cpp,并创建一个文件夹dir,并在其中创建一个文件file1.txt方便对照。
1 | touch a.txt |
(这里不要顺手cd进入文件夹哦?)
输入ls(list)列出当前文件夹下的文件,能看到如下界面,即为正常。
参考目录结构:
1 | mydir/ |
文件权限符号的含义
如何查看文件所具有的权限呢?
输入命令:
1 | ls -l |
这里的-l参数的含义是long,显示文件的详细信息。
此时我们可以看到:
这里简单说明一下输出的组成:
从左到右,第一个字符表示文件类型:
- -: 普通文件。
- d: 目录。
- l: 符号链接。
- c: 字符设备文件。
- b: 块设备文件。
- p: 命名管道 (FIFO)。
- s: socket 文件。
可见,除了dir外,这里都是-普通文件。
接下来的9个字符,表示文件权限,它们每三个成一组,以dir的文件权限rwxr-xr-x为例
三个为一组,就是,rwx丨r-x丨r-x。我们首先搞明白rwx以-及分别代表什么含义:
r: 读权限 (read)。w: 写权限 (write)。x: 执行权限 (execute)。-: 表示没有对应的权限。
接下来我们来解读一下rwx:具有读权限,具有写权限,具有执行权限。
对于单个文件来说,这三种权限的作用很好理解,
- 读权限(r)决定了能否读取文件中的内容,
- 写权限(w)决定了能否修改文件中的内容,
- 执行权限(x)则决定了能否执行该文件(在文件是可执行文件的前提下)。
而如果一个文件夹,我们在此背景下解读,对于一个文件夹来说,读权限和写权限是作用文件夹自身及其内部的文件的,读权限(r),是否能读取文件夹内部的文件,比如dir里的file1.txt文件,写权限(w),能否对file1.txt进行修改。
而 执行权限(x) 的含义是允许用户进入该目录,这是访问到目录中内容的前提条件。因此,只有同时拥有执行权限(x)和读权限(r),用户才能真正查看目录中的内容。 如果没有 x 权限,即使拥有 r 或 w 权限,用户无法进入该目录进行任何操作。
接下来,我们再来看文件权限三个rwx的排列分别是对那些群体生效。
以依然以dir的文件权限为例:
开头的rwx,对应的的是拥有该文件或目录的用户(Owner/User)的权限,以笔者(用户名就是root) ls -l的输出为例,数字之后的第一个 root即为该文件/目录的拥有者。
接下来r-x,对应的是该文件/目录所属的用户组(Group)的权限,一个用户可以属于对个用户组。以笔者的输出为例,数字之后的第二个 root即为该文件或目录所属的组别。
最后的r-x,对应是其它用户(Others)的权限,指的是既不属于文件所有者,也不属于所属组的其他用户。
文件权限相关的命令
准备工作
首先,我们需要一个简单的 C++ 程序。使用vim或vi命令打开b.cpp文件,在其中输入以下代码:
1 |
|
保存并退出b.cpp 文件。
编译 b.cpp
接下来,我们使用 g++ 编译器来编译 b.cpp 文件:
1 | g++ b.cpp -o test |
(如果这里提示g++:command not found,说明系统未安装gcc/g++,请自行搜索 Linux如何安装gcc/g++解决)
这条命令会将 b.cpp 编译成一个可执行文件 test。现在,使用 ls -l 查看当前目录下的文件:
此时多了可执行文件test。注意到,它相对于a.txt和b.cpp多了x权限,这便是可执行文件的执行权限。
现在,我们可以尝试直接执行test文件:
1 | ./test |
你会看到终端输出:
1 | Hello, Linux |
这表示我们成功执行了 test 文件。
修改文件权限:chmod 命令
chmod 命令是 Linux 中用于修改文件或目录权限的关键工具。它的基本用法如下:
1 | chmod [选项] 权限 文件/目录 |
使用数字模式修改权限
chmod 最常用的方式之一是使用数字模式来设置权限。这种模式将 rwx 权限表示为数字:
r(读) = 4w(写) = 2x(执行) = 1-(无权限) = 0
通过将这些数字相加,可以得到不同的权限组合。例如:
rwx= 4 + 2 + 1 = 7rw-= 4 + 2 + 0 = 6r-x= 4 + 0 + 1 = 5r--= 4 + 0 + 0 = 4-wx= 0 + 2 + 1 = 3- …
现在,让我们通过一些例子来演示如何使用 chmod 修改权限。
示例1:给 a.txt 添加写权限
首先,查看 a.txt 的当前权限:
1 | ls -l a.txt |
你应该看到类似如下的输出:
1 | -rw-r--r-- 1 root root 0 Jan 22 10:30 a.txt |
现在,我们使用 chmod 给 a.txt 的所有者添加写权限:
1 | chmod 644 a.txt |
这里,644 表示:
- 所有者 (user):
rw-(4+2+0 = 6) - 组 (group):
r--(4+0+0 = 4) - 其他用户 (others):
r--(4+0+0 = 4)
再次查看 a.txt 的权限:
1 | ls -l a.txt |
你应该看到:
1 | -rw-r--r-- 1 root root 0 Jan 22 10:30 a.txt |
说明权限没有改变,因为我们修改的权限和原来的权限一样。
我们尝试修改为744,表示拥有者具有rwx的权限。
1 | chmod 744 a.txt |
再次查看权限:
1 | ls -l a.txt |
现在应该看到:
1 | -rwxr--r-- 1 root root 0 Jan 22 10:30 a.txt |
可以看到已经成功修改了权限。
示例2:移除 test 的执行权限
首先,查看 test 的当前权限:
1 | ls -l test |
你可能会看到类似这样的输出:
1 | -rwxr-xr-x 1 root root 8680 Jan 22 10:30 test |
这表示 test 文件拥有执行权限(x)。现在我们使用 chmod 命令移除 test 文件的执行权限:
1 | chmod 644 test |
这里,644 表示:
- 所有者 (user):
rw-(4+2+0 = 6) - 组 (group):
r--(4+0+0 = 4) - 其他用户 (others):
r--(4+0+0 = 4)
再次查看 test 的权限:
1 | ls -l test |
你会看到输出变为:
1 | -rw-r--r-- 1 root root 8680 Jan 22 10:30 test |
现在 test 文件不再具有执行权限。
此时,如果我们尝试直接执行 test 文件,会提示 “Permission denied”:
1 | ./test |
示例3:给 test 添加执行权限
现在,我们使用 chmod 给 test 文件添加执行权限:
1 | chmod 755 test |
这里,755 表示:
- 所有者 (user):
rwx(4+2+1 = 7) - 组 (group):
r-x(4+0+1 = 5) - 其他用户 (others):
r-x(4+0+1 = 5)
再次查看 test 的权限:
1 | ls -l test |
你会看到输出变为:
1 | -rwxr-xr-x 1 root root 8680 Jan 22 10:30 test |
现在 test 文件重新拥有执行权限。你可以再次执行 test 文件:
1 | ./test |
你将会看到终端输出:
1 | Hello, Linux |
示例4:给 dir 目录添加所有权限
查看 dir 目录的当前权限:
1 | ls -ld dir |
输出类似:
1 | drwxr-xr-x 2 root root 4096 Jan 22 10:30 dir |
现在,我们给 dir 目录的所有者、组和其他用户都添加所有权限:
1 | chmod 777 dir |
再次查看 dir 目录的权限:
1 | ls -ld dir |
输出:
1 | drwxrwxrwx 2 root root 4096 Jan 22 10:30 dir |
可以看到所有用户都拥有了读写执行权限。
使用符号模式修改权限
除了数字模式,chmod 还支持使用符号模式来修改权限,这在某些情况下更直观。符号模式的基本格式如下:
1 | chmod [who] [操作符] [权限] 文件/目录 |
who: 表示权限作用的对象:u: 所有者 (user)g: 组 (group)o: 其他用户 (others)a: 所有用户 (all),等同于ugo
操作符: 表示操作类型:+: 添加权限-: 移除权限=: 设置权限(覆盖原有权限)
权限:r、w、x的任意组合
示例5:给 a.txt 的组用户添加写权限
1 | chmod g+w a.txt |
这条命令表示给 a.txt 的组用户添加写权限。
示例6:移除 test 的其他用户的读权限
1 | chmod o-r test |
这条命令表示移除 test 的其他用户的读权限。
示例7:设置 dir 目录的所有者为读写执行,组用户为读执行,其他用户无权限
1 | chmod u=rwx,g=rx,o= dir |
这条命令表示设置 dir 目录的所有者为读写执行,组用户为读执行,其他用户无权限。
修改文件所有者和所属组:chown 和 chgrp 命令
除了修改权限,我们还可以修改文件的所有者和所属组。
修改所有者:chown 命令
chown 命令用于修改文件的所有者。其基本用法如下:
1 | chown [选项] 用户名 文件/目录 |
例如,假设我们想把 a.txt 的所有者改为用户 testuser(请先创建这个用户,这里假设已经创建):
1 | sudo chown testuser a.txt |
(需要 sudo 权限)
修改所属组:chgrp 命令
chgrp 命令用于修改文件的所属组。其基本用法如下:
1 | chgrp [选项] 组名 文件/目录 |
例如,假设我们想把 a.txt 的所属组改为 testgroup(请先创建这个组,这里假设已经创建):
1 | sudo chgrp testgroup a.txt |
(需要 sudo 权限)
同时修改所有者和所属组
chown 命令还可以同时修改所有者和所属组,使用 用户名:组名 的形式:
1 | sudo chown testuser:testgroup a.txt |
文件权限掩码:umask
在 Linux 中,当我们创建新文件或目录时,系统会根据一个称为 文件权限掩码(umask) 的值来设置它们的默认权限。umask 的作用是 屏蔽 掉某些权限,而不是直接赋予权限。
查看 umask 值
你可以使用以下命令查看当前的 umask 值:
1 | umask |
通常,你会看到类似 0022 或 0002 的输出。这个值也是一个八进制数,与 chmod 使用的数字模式类似,但它的含义是 要屏蔽的权限。
理解 umask 的工作原理
umask 的工作原理如下:
默认权限: 系统会为新创建的文件和目录设置默认的最大权限。
- 对于文件,默认权限通常是
666(rw-rw-rw-)。 - 对于目录,默认权限通常是
777(rwxrwxrwx)。
- 对于文件,默认权限通常是
权限屏蔽:
umask值中的每一位都表示要屏蔽的权限。0表示不屏蔽对应权限。1表示屏蔽对应权限。
最终权限: 系统会将默认权限减去
umask值,得到最终的权限。
umask 的计算
让我们用一个例子来说明:假设 umask 的值为 022。
- 默认文件权限:
666(rw-rw-rw-) - umask 值:
022,转换为二进制是000 010 010。 - 屏蔽权限:
- 所有者 (
u):0(不屏蔽任何权限) - 组 (
g):2(屏蔽写权限) - 其他用户 (
o):2(屏蔽写权限)
- 所有者 (
- 最终文件权限:
666-022=644(rw-r--r--)
同样,对于目录:
- 默认目录权限:
777(rwxrwxrwx) - umask 值:
022,转换为二进制是000 010 010。 - 屏蔽权限:
- 所有者 (
u):0(不屏蔽任何权限) - 组 (
g):2(屏蔽写权限) - 其他用户 (
o):2(屏蔽写权限)
- 所有者 (
- 最终目录权限:
777-022=755(rwxr-xr-x)
修改 umask 值
你可以使用 umask 命令来修改当前的 umask 值:
1 | umask 002 |
这个命令会将 umask 值设置为 002,意味着创建的文件默认权限会是 664 (rw-rw-r--),而目录默认权限会是 775 (rwxrwxr-x)。
注意: umask 的修改只对当前 shell 会话有效,要永久修改,需要修改 shell 的配置文件(例如 ~/.bashrc 或 ~/.zshrc)。




