这篇博客记录了linux权限的一些相关的概念与知识。

🏥 权限的概念

在多用户计算机系统的管理中,权限(privilege)是指某个特定的用户具有特定的系统资源使用权力,像是文件夹,特定系统指令的使用或存储量的限制。通常,系统管理员,或者在网络中的网络管理员,对某个特定资源的使用分配给用户不同的权限,系统软件则自动地强制执行这些权限。(以上摘自百度百科)
总的来说,Linux的权限管理是一种重要的安全特性,它可以帮助我们控制文件和目录的访问权限,从而保护系统的安全性。在Linux系统中,每个文件和目录都有一个所有者和一组权限,用于控制用户对它们的访问权限。权限掩码包括读、写、执行三个权限位,每个用户组都有一个访问权限掩码,系统会根据该访问权限掩码和用户的身份(所有者、组或其他人)来确定其访问权限。文件访问者可以分为所有者、所属组和其他人三类,文件类型包括普通文件、目录文件、设备文件、命名管道和套接字文件等。Linux系统中,共有三种表示方法来表示文件或目录的访问权限,包括数字表示法、符号表示法和字母表示法。我们可以使用chmod、chown和chgrp等命令来修改文件和目录的访问权限、所有者和组。目录的权限决定了用户是否能够访问该目录、查看其中的文件列表以及向其中添加或删除文件。在Linux系统中,正确地设置文件和目录的权限可以有效地保护系统的安全性。
以下我将会尽可能的将这些概念理清楚。

🏣 用户

在平时使用Windows系统时,会遇到以管理员权限来执行命令的时候,这是因为当前执行命令所需要的用户等级偏高,普通用户是无法进行此类操作的。linux也是同理。

🏪 用户分类

在Linux系统下,有两种类型的用户,超级用户与普通用户

  1. 超级用户在Linux系统里几乎可以做到任何事而不受限制与管辖。
  2. 普通用户则是在规则下行事,不能越界执行操作。

在Linux系统中,可以使用su和sudo命令在超级用户和普通用户之间进行转换。

🏦两种切换命令

su命令
su命令用于切换用户身份,即从当前用户切换到另一个用户。若不指定切换到的用户,则默认为超级用户root。执行su命令后需要输入目标用户的密码才能切换到目标用户身份。
要从普通用户切换到超级用户,可以执行以下命令:

1
su

然后再输入超级用户root的密码即可切换到root用户身份。
若要切换到其他用户,需在su命令后加上目标用户名称:

1
su username

其中,username为目标用户名称。执行该命令后同样需要输入目标用户的密码才能切换到目标用户身份。

sudo命令
sudo命令也用于切换用户身份,但相较于su命令,它有更为灵活的设置和使用方式。sudo命令允许普通用户以超级用户的身份执行某些特定命令,而不需要切换到超级用户身份。
例如,要以超级用户的身份执行某个命令,可以在该命令前加上sudo关键字,如下所示:

1
sudo command

其中,command为要执行的命令。执行该命令后需要输入当前用户的密码才能以超级用户身份执行该命令。
但是sudo命令是需要配置的,需要在/etc/sudoers文件中进行相应的设置。只有在该文件中配置了当前用户可执行的命令及其对应的权限,才能通过sudo命令进行身份切换。这点很重要哦。至于如何进行配置,可以自行百度或者谷歌。

🏨文件的权限管理

Linux里一切皆文件,对于权限的理解自然要从文件入手。

💒文件访问者

在开头便说到了,文件是否向用户开放取决于此用户对于此文件所拥有的权限。
root是超级用户的一员,也就是他可以无视所有的规则,为所欲为,拥有系统上的最高权限。除了root用户之外,还可以通过sudo命令将其他用户授权为超级用户,从而间接的拥有系统的最高权限。这点在上文中也提到了。在Linux系统中,超级用户可以执行所有命令,修改系统配置,访问系统所有文件和目录,以及管理其他用户和用户组等。
在一些特定的Linux发行版中,也可能会提供其他超级用户,如FreeBSD中的wheel组等。但是,在普通的Linux系统中,root用户是唯一的超级用户。
总而言之,超级用户不受文件的权限约束,真正需要遵守规则访问文件的是所有者、所属组和其他人三类普通用户。
在Linux系统中,每个用户都有一个唯一的用户标识符(User ID,UID)和一个所属组标识符(Group ID,GID),用于区分不同的用户和用户组。在文件或目录上设置的所有者和所属组,都是用对应用户或用户组的UID和GID来标识的。而其他人则是指除了所有者和所属组之外的所有用户,也都是普通用户。在Linux系统中,所有用户都应该遵循最小权限原则,即只给予必要的权限,以提高系统的安全性。

  • 文件与文件目录的所有者: u(user)
  • 文件与文件目录所在者的所在组的用户: g(group)
  • 其他用户: o(others)

⛪ 文件类型与访问权限

那文件是如何针对设置的所有者与所属组来进行区别的呢?当使用ls -l指令时,Linux会给出该目录下文件的详细信息,其中就包含一串字母 ,例如:

其中第一个位置表示的是文件的类型。

  1. d:表示文件夹
  2. -:表示普通文件
  3. 还有些其他的文件,例如b是块设备,p是管道文件等等,在这里并不是重点,就不过多的介绍了。

后面接着的九位便是代表三种普通用户的权限。

  • r代表read,也就是,具备读取文件内容的权限,对目录而言则可以浏览目录信息。
  • w代表write,也就是,具备修改文件内容的权限,对目录而言则可删除移动目录内文件。
  • x代表execute,也就是执行,具备执行文件的权限,对目录而言则是可以进入目录。

再往后的0和4096则是代表文件的大小。May后面的一串则是文件的最新修改日期。最后的则是文件名。

文件或目录就是依靠第二到第十位来确定用户是否具有与操作对应的权限。换言之,如果文件所有者想执行上面的file1,是无法进行的,因为chengzi这个用户不具备x权限。

不过权限可以进行修改
在Linux系统中,可以使用chmod命令来修改文件或目录的权限。该命令的基本语法如下:

1
chmod [选项] 模式 文件名

其中,各项含义如下:
选项:可以使用不同的选项来指定不同的权限设置方式,常用的选项包括-R(递归修改目录下的所有文件和子目录)和-v(显示修改的文件)等;

模式:用于指定要修改的权限模式,可以使用数字或符号两种方式来指定;

文件名:要修改权限的文件或目录名称。

  • 数字方式:
    在数字方式中,每个权限用一个数字表示,分别为读(4)、写(2)和执行(1),没有权限则用0表示。将这些数字相加,即可得到对应的权限组合。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rwx:4+2+1=7

rw-:4+2=6

r-x:4+1=5

r--:4

-wx:2+1=3

-w-:2

--x:1

---:0

使用数字方式修改权限时,可以使用以下命令:

1
chmod 777 filename

其中,777表示所有者、所属组和其他人都有读、写和执行的权限。需要注意的是,使用数字方式修改权限时,每个数字代表的含义是固定的,因此需要根据具体需求来指定权限组合。

  • 符号方式:
    在符号方式中,使用符号来表示要修改的权限,包括以下4种符号:
1
2
3
4
5
6
7
8
9
10
11
+:添加权限;

-:取消权限;

=:设置权限;

u/g/o:表示用户类型,其中u表示所有者,g表示所属组,o表示其他人;

r/w/x:表示权限类型,其中r表示读取权限,w表示写入权限,x表示执行权限;

a:表示所有用户。

使用符号方式修改权限时,可以使用以下命令:

1
chmod u+r filename

其中,u+r表示为所有者添加读取权限。符号方式修改权限比数字方式更为直观,但需要根据具体需求来指定权限设置方式。
除了chmod命令,也可以使用chown命令来修改文件或目录的所有者,使用chgrp命令来修改文件或目录的所属组

例如

1
chown user1 filename

修改user1为filename的拥有者。charp同理,修改文件目录的所属组。

linux还有默认的掩码值,超级用户默认为0022,普通用户则为0002。

1
2
umask //查看
umask 0010 //修改

我们所创建的文件的权限是默认权限& ~掩码值

  • 新建文件夹默认权限为0666
  • 新建目录默认权限为0777

按照给出的公式计算即可得出该文件/目录的真正权限。

🏤 补充

依照上面讲的知识,只要用户拥有对一个文件的写权限,那么就可以删除目录的文件,这显然对文件创建于维护者是极不公平的。
所以Linux引入了粘滞位的概念:

1
chmod +t directory_name

只要在某个目录加上了粘滞位,那么目录下的文件只可以由超级用户,该目录所有者,或该文件所有者删除。
还有一点需要注意,目录的可执行权限表示你是否可以在目录下执行命令
若目录没有-x权限,那么就无法对目录执行任何命令,在这种情况下,如果尝试使用ls命令来查看该目录的内容,将会提示“Permission denied”(权限被拒绝)的错误信息,因为没有访问该目录的权限。
如果没有执行权限,表示用户不能进入该目录,也就无法查看该目录中的文件和子目录,因此也就失去了读(r)权限的作用;同时,也无法在该目录中创建、删除、移动或重命名文件和子目录,因此也就失去了写(w)权限的作用。
因此,如果对于某个目录,没有执行权限,则相当于同时没有读(r)和写(w)权限。