2

你了解 Linux 文件权限和所有权吗?

 1 year ago
source link: https://www.51cto.com/article/721982.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
537a91057bd91eb0882592d1499df7588e8983.jpg

Linux 是被设计为多用户的操作系统。在企业级系统中,会有多个用户访问同一个系统。但是,如果任何用户都可以访问和修改属于其他用户或系统所有的文件,这肯定会带来安全风险。

这就是为什么 UNIX 和 Linux(Linux 是类 UNIX 的系统)有内置的安全措施,这确保了文件或目录只能由所需的用户访问、修改或执行。

在 Linux 中,哪个用户能够访问哪个文件取决于两个因素:

  • 文件所有权

理解文件所有权和权限对于 Linux 用户来说至关重要。本文将介绍相关内容。

Linux 中的文件所有权

注:本文所提到的文件,也包括目录(Linux中,目录也是属于文件)。

Linux 中的每个文件和目录都有三种所有者:

用户是文件的所有者。你创建了一个文件,那么这个文件的所有者就是你。所有权也是可以被修改的(我们会在后面介绍到)。

每个用户都是某个组的一部分。一个组由多个用户组成,这是在多用户环境中管理用户的一种方法。

比如,你有开发组,质保组,以及系统管理组都访问统一系统,那么你应该为他们单独创建组。这样,你可以有效的管理文件和系统的安全性。这样也会节省时间,因为你无需手动为每个用户添加权限,而只需要将他们添加到相关组中,并更改组的权限即可。本文稍后会做详细介绍。

即便你是这个系统中的唯一用户,那么你仍然是众多组中的一员。像 Ubuntu 这样的发行版,也会为一个用户创建相同名称的组。

注:运行 groups 命令可以查看你所属的用户组。

“其他”可以被视为系统中所有用户的超级组。基本上,任何能够访问该系统的人都属于这个组。

总体而言,“用户”是单个用户,“组”是用户的集合,“其他”是由系统中所有的用户组成。

Linux 中的文件权限

Linux 中的每个文件和目录对所有三种所有者都有以下三种权限:

  • 读 - 可以查看或复制文件内容;
  • 写 - 可以修改文件内容;
  • 执行 - 可以运行文件(如果其可执行)。
  • 读 - 可以列出所有子文件,并可以从目录中复制文件;
  • 写 - 可以在目录中添加或删除文件(也需要执行权限);
  • 执行 - 可以进入目录。

Linux 中的文件权限和所有权

以上是关于文件权限和所有权的基本知识,现在我们来通过实例介绍下。

在Linux中,你可以使用 stat 或者 ls 命令来查看文件的权限。如果你使用 ls 命令,那需要带上 -l 选项,你会看到如下输出:

-rwxrw-r-- 1 gliu gliu 457 May 10 11:55 filename.txt

对于以上输出的解释如下:

73b7023929ceee5c5b70669edfd75291c331d0.jpg
  • 文件类型:表示文件的类型,d 表示目录,– 表示常规文件,l 表示符号链接;
  • 权限:显示文件的权限,我们在本文后面详细介绍;
  • 硬链接数:显示文件是否有硬链接,默认为1;
  • 所有者:文件所属用户;
  • 所属组:有权访问此文件的组,一次只能有一个组是文件的所有者;
  • 文件大小:文件的大小(单位为b);
  • 修改时间:文件的最后修改时间;
  • 文件名称:文件或者目录的名称。

上述是我们对 ls -l 命令输出的解释,现在我们主要看下权限的部分。

在上面的命令中,你可以看到权限的显示为9位字符,格式如下:

rwxrw-r--

其中的每个字母表示一个特定的权限:

  • r: 读权限;
  • w: 写权限;
  • x: 执行权限;
  • -: 没有权限。

权限始终按读、写和执行的顺序排列,即rwx。然后,按照用户、组和其他的顺序为所有三种所有者设置这些权限。

d3997ed377b6d0529c4993e3c28779cf5b943a.jpg

结合上图,我们可以了解到:

1)文件的所有者,具有对该文件的读取、写入和执行的权限。但是这个文件的所有者是谁呢?在 ls -l 命令中有此信息的输出(即用户 gliu);

2)文件所属组有对其读写权限,但是没有执行权限。那是哪一组呢?在 ls -l 命令中有此信息的输出(即用户组 gliu);

3)该文件仅对其他人(即有权访问系统的所有人)具有读取权限。你不需要知道它是哪个,因为“其他”是指所有用户。

再次看下 ls -l 命令的输出结果,我们应该能看出文件的权限以及所有者了:

-rwxrw-r-- 1 gliu gliu 457 May 10 11:55 filename.txt

文件 filename.txt 属于用户 gliu 所有,并且gliu对该文件具有读写和执行的权限;用户组 gliu 中所有的用户对该文件都具有读和写的权限,然后其他用户对该文件都是只读的权限。

注意:root 用户具有超级权限,通常它对所有文件都具有读、写和执行权限,即使您在文件权限中没有看到它。

单个用户可以是多个组的成员,但只有主要的组是用户创建文件的所属组。用户所在的主要组可以使用 id 命令找到,比如 id -gn . 如果要查询自己的主要组,省略参数。

通过上文的描述我们知道了如何查看文件的权限,接下来我们看看如何更改文件的权限和所有权。

在 Linux 中更改文件权限

在 Linux 中,我们可以使用 chmod 命令来更改文件的权限。

注:权限在过去被称为访问模式(mode of access),因此 chmod 是更改访问模式的简称。

使用 chmod 命令有两种方法:

  • 绝对模式(Absolute mode)
  • 符号模式(Symbolic mode)

在绝对模式下使用 chmod

在绝对模式下,权限以数字形式表示(精确地说是八进制)。在这个系统中,每个文件权限都由一个数字表示。

  • r (read,读) = 4
  • w (write,写) = 2
  • x (execute,执行) = 1
  • – (无权限) = 0

通过这些数值,可以将它们组合在一起,因此可以使用一个数字来表示整个权限集。

数值

权限

3(2 + 1)

5( 4 + 1)

6(4 + 2)

7(4 +2 + 1)

上文中的文件 filename.txt,如果使用数字来表示权限的话,是什么呢?没错,应该是 764。

通过以上描述我们知道了什么数字代表什么权限,那么现在我们来看一下如何更改文件权限。

如果你要更改文件 filename.txt 的权限,想让每个人都可以读写,但是不能执行,那么可以使用如下命令:

chmod 666 filename.txt

然后使用 ls -l 命令查看一下,就会发现文件的权限被更改了:

-rw-rw-rw- 1 gliu gliu 457 May 10 11:55 filename.txt

在符号模式下使用chmod

绝对模式的问题是,即使你只想更改一个所有者的权限,也需要提供三个所有者的数字。

所以,此时你可以使用 chmod 命令的符号模式。

在符号模式下,所有者用以下符号表示:

  • u = 用户所有者(user owner)
  • g = 所属组(group owner)
  • o = 其他(other)
  • a = 所有用户 (user + group + other)

然后,符号模式使用数学运算符来执行权限更改:

  • – 移除权限
  • = 使用新的权限覆盖现有权限

现在,我们来看看如何在符号模式下使用chmod命令。

在前面的例子中,如果要为所属组(组所有者)添加执行权限,可以这样使用 chmod 命令:

chmod g+x filename.txt

现在再次使用 ls -l 命令查看文件,会看到已为所属组添加了执行权限:

-rw-rwxrw- 1 gliu gliu 457 May 10 11:55 filename.txt

另外,还可以将多个权限的更改合并到一个命令中。假如我们要为其他用户删除读写权限,添加执行权限,同时还为所属组用户添加执行权限,可以通过如下命令来完成:

chmod o-rw+x,u+x filename.txt

执行后结果如下:

-rwxrwx--x 1 gliu gliu 457 May 10 11:55 filename.txt

如果要同时更改所有三种用户的权限,可以按以下方式:

chmod a-x filename.txt

这样会删除所有用户的执行权限:

-rw-rw---- 1 gliu gliu 457 May 10 11:55 filename.txt

更改文件所有权

要更改文件的所有权,可以使用 chown 命令。它表示 change owner。

可以按如下方式更改文件的所有者:

chown <new_user_name>

如果想要更改用户和组,可以使用如下命令:

chown <new_user_name>:<new_user_group>

如果只想更改组,那么可以这样执行 chown 命令:

chown :<new_user_group>

或者可以使用专门用户更改文件和目录所属组的 chgrp 命令。这个命令很容易可以猜到表示 change group。

chgrp <new_user_group>

举个例子,如果我们想要把文件 filename.txt的所有者和组都改为root,可以使用如下命令:

sudo chown root:root filename.txt

这样就会将文件的用户所有权,和组所有权,都改为root。

-rw-rw---- 1 root root 457 May 10 11:55 filename.txt

注意到上述命令中使用 sudo 了吗?这是因为这个命令涉及到了root用户,要处理root用户,需要使用超级用户权限。

注:同一个文件不能被两个组所拥有。

文件权限有优先权吗?

设想一种情况,其中用户所有者没有任何权限,组具有读取权限,而其他组具有读取和写入权限。

----r--rw- 1 gliu gliu 457 May 10 11:55 filename.txt

那么,如果用户 gliu 想要使用 cat 或者 less 命令来读取这个文件,会成功吗?答案是不会,因为它没有读权限。

但是用户 gliu 是组 gliu(这个是组名称) 的一个成员,而该组具有读取权限,这应该表示组内的每个人(包括用户gliu)都应该有读的权限才对啊?答案是否定的。

在 Linux 中,优先级是从用户,到组,然后再到其他。系统会检查是谁启动了进程(在我们的例子中进程是 cat 或者 less),如果启动进程的用户同时也是文件的所属组用户,那么就会设置用户权限位。

如果启动进程的不是文件所有者,那么系统就会检查组,如果启动进程的用户恰好在文件所属组中,那么将设置组权限位。

如果启动进程的用户不是文件所属组中的用户,那么就会设置其他权限位。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK