AI速览:这篇笔记详细介绍了 Linux 文件权限管理的基础知识和常用命令,并提供了丰富的示例,方便读者理解和实践。通过学习这篇笔记,可以掌握如何查看、修改文件权限,以及如何管理文件的所有者和所属组,设置文件权限掩码。

初识Linux权限管理

前置需求:

  1. 拥有至少一台Linux虚拟机或云服务器皆可
  2. 具有一定的编程基础
  3. 了解Linux基础命令,会使用vim编辑文件
  4. 善于向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
2
3
4
touch a.txt
touch b.cpp
mkdir dir
touch dir/file1.txt

(这里不要顺手cd进入文件夹哦?)

输入ls(list)列出当前文件夹下的文件,能看到如下界面,即为正常。

参考目录结构:

1
2
3
4
5
mydir/
├── a.txt
├── b.cpp
└── dir/
└── file1.txt

文件权限符号的含义

如何查看文件所具有的权限呢?

输入命令:

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:具有读权限,具有写权限,具有执行权限。

对于单个文件来说,这三种权限的作用很好理解,

  1. 读权限(r)决定了能否读取文件中的内容,
  2. 写权限(w)决定了能否修改文件中的内容,
  3. 执行权限(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
2
3
4
5
#include <iostream>
int main() {
std::cout << "Hello, Linux" << std::endl;
return 0;
}

保存并退出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 (读) = 4
  • w (写) = 2
  • x (执行) = 1
  • - (无权限) = 0

通过将这些数字相加,可以得到不同的权限组合。例如:

  • rwx = 4 + 2 + 1 = 7
  • rw- = 4 + 2 + 0 = 6
  • r-x = 4 + 0 + 1 = 5
  • r-- = 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

现在,我们使用 chmoda.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 添加执行权限

现在,我们使用 chmodtest 文件添加执行权限:

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
  • 操作符: 表示操作类型:
    • +: 添加权限
    • -: 移除权限
    • =: 设置权限(覆盖原有权限)
  • 权限: rwx 的任意组合

示例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

通常,你会看到类似 00220002 的输出。这个值也是一个八进制数,与 chmod 使用的数字模式类似,但它的含义是 要屏蔽的权限

理解 umask 的工作原理

umask 的工作原理如下:

  1. 默认权限: 系统会为新创建的文件和目录设置默认的最大权限。

    • 对于文件,默认权限通常是 666 (rw-rw-rw-)。
    • 对于目录,默认权限通常是 777 (rwxrwxrwx)。
  2. 权限屏蔽: umask 值中的每一位都表示要屏蔽的权限。

    • 0 表示不屏蔽对应权限。
    • 1 表示屏蔽对应权限。
  3. 最终权限: 系统会将默认权限减去 umask 值,得到最终的权限。

umask 的计算

让我们用一个例子来说明:假设 umask 的值为 022

  1. 默认文件权限: 666 (rw-rw-rw-)
  2. umask 值: 022,转换为二进制是 000 010 010
  3. 屏蔽权限:
    • 所有者 (u): 0 (不屏蔽任何权限)
    • 组 (g): 2 (屏蔽写权限)
    • 其他用户 (o): 2 (屏蔽写权限)
  4. 最终文件权限: 666 - 022 = 644 (rw-r--r--)

同样,对于目录:

  1. 默认目录权限: 777 (rwxrwxrwx)
  2. umask 值: 022,转换为二进制是 000 010 010
  3. 屏蔽权限:
    • 所有者 (u): 0 (不屏蔽任何权限)
    • 组 (g): 2 (屏蔽写权限)
    • 其他用户 (o): 2 (屏蔽写权限)
  4. 最终目录权限: 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)。