Linux权限的概念
在Linux中,用户分为两大类:超级用户(root)、普通用户。
- 超级用户:可以再linux系统下做任何事情,不受限制
- 普通用户:在linux下做有限的事情。
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
切换用户的命令:su [用户名]
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root
(root可以省略)(此做法不会改变当前所在的工作目录)也可以使用su -
(这样输入的意思是以root账户重新进入系统(也就意味着所处的工作目录会改变)),此时系统会提示输入root用户的密码。
Linux权限管理
文件访问者的分类(人)
- 文件和文件目录的所有者:u—User
- 文件和文件目录的所有者所在的组的用户:g—Group
- 其它用户:o—Others
我们可以直观的来看看:
我们在Linux中使用ll命令(查看文件详细信息),我所勾出来的信息对应的就是拥有者和所属组。
这里没有将other列出来,是因为other是不确定的某个用户,对于每个不同的拥有者来说,other都是不同的。
那么什么是所属组呢?
所属组(Group)是用于对用户进行分类管理和权限分配的一种机制。例如,对于一个项目文件夹,可以将参与该项目的多个用户归为一个组,并为该组设置相应的读写执行权限,从而方便这些用户共同协作和访问相关资源,同时限制其他组用户的访问。这样的分组管理方式提高了系统的安全性和资源管理的灵活性,有助于更精细地控制文件和目录的访问权限。(不过在现在云服务器配置相当充沛的情况下,所属组也运用的比较少了)
文件类型和访问权限
在 Linux 中,使用 ll 命令查看文件时,显示出来的文件详细信息通常包括以下各项:
- 文件类型和权限:最前面的字符表示文件类型,如 - 表示普通文件, d 表示目录
- 链接数:表示该文件的硬链接数。
- 文件所有者:文件的拥有者。
- 文件所属组:文件所属的用户组。
- 文件大小:以字节为单位显示文件的大小。
- 修改时间:文件最后修改的时间。
- 文件名:文件或目录的名称。
文件类型
我们在Windows系统当中,一般是通过文件后缀来判断每个文件分别是什么类型的,那么在Linux中,通常包括哪些类型的文件呢?
d:(directory)文件夹
-:普通文件(通常包括:文本文件,源代码,图片,视频,库文件,可执行文件等)
l:(link)软链接(类似Windows的快捷方式)
b:(block)块设备文件(例如硬盘、光驱等)
p:(pipeline)管道文件
c:(char)字符设备文件(例如屏幕等串口设备)
s:(socke)套接口文件
在Linux中,系统是不通过文件名的后缀来判断文件类型的,但是对于文件后缀的态度,我们依旧推荐使用!原因如下:
- 方便我们人,能够看一眼就知道是什么类型的文件
- 在Linux下,一些工具需要通过文件后缀来判断文件是否可以通过这些工具来执行(注意:Linux系统本身是不通过文件后缀来判断文件是什么类型的,但Linux系统下的一些文件需要),比如:我使用gcc来编译一段代码,如果文件名没有
.c
后缀,就不能被gcc这个工具识别到
但是如果我将文件名加上一个后缀.c
,就能够编译成功了
基本权限
- 读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
- 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
- 执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
- “—”表示不具有该项权限
从这张图看:
- 对于
test.c
来说,它只是一个普通文件,拥有者和所属组对它有读、写权限,other对它只有读权限。 - 对于
test.exe
文件来说(我通过test.c
编译形成的可执行文件),拥有者和所属组对它都有读、写、执行的权限,对于other来说,只有读、执行的权限。
文件权限值的表示方法:
- 字符表示法
Linux表示 | 说明 |
---|---|
- - - | 无权限 |
- - x | 仅可执行 |
- w - | 仅可写 |
- w x | 可写和可执行 |
r - - | 只读 |
r - x | 可读可执行 |
r w - | 可读可写 |
r w x | 可读可写可执行 |
- 八进制数值表示法
权限符号(rwx) | 八进制 | 二进制 |
---|---|---|
- - - | 0 | 000 |
x | 1 | 001 |
w | 2 | 010 |
wx | 3 | 011 |
r | 4 | 100 |
rx | 5 | 101 |
rw | 6 | 110 |
rwx | 7 | 111 |
文件访问权限的相关设置方法
chmod
功能:在Linux中,我们可以通过chomd指令来设置不同用户(包括拥有者,所属组,其他用户)对文件的读、写和执行权限
格式:chmod [参数]权限 文件名
常用选项:
R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
chmod命令权限值的格式:
- + : 向权限范围增加权限代号所表示的权限
- - : 向权限范围取消权限代号所表示的权限
- = : 向权限范围赋予权限代号所表示的权限
用户符号:
- u:拥有者
- g:拥有者同组用
- o:其它用户
- a:所有用户
示例:
就比方说,现在我是拥有者hyt
,我对test.c
文件,目前是可读可写的
但拥有者可以通过chmod
指令来将拥有者自己的读写权限关掉
chmod u-rw ./test.c
此时拥有者就不能对这个文件进行读写操作了!
可能会有人有疑问,hyt
是拥有者的同时也是所属组,而且所属组是具有读写权限的,为什么hyt
不能对test.c
文件进行读写操作。
原因是因为Linux在进行文件权限检查的时候,检查身份时,会按照:拥有者 -> 所属组 -> 其他用户 ;这样的顺序去检查,如果当它检查到你身份时,就会检查对应的权限是否开放,不会再去匹配下一层的身份。
这个问题也很好验证,我将该文件的拥有者改一下
chown
功能:修改文件的拥有者
格式:chown [参数] [用户名] [文件名]
chown [参数] [用户名]:[所属组名] [文件名](这样可以修改拥有者和所属组)
常用选项:R -> 递归修改目录文件的权限
说明:该命令只能以超级管理员的形式执行
此时test.c
的拥有者是root
,hyt
是test.c
的所属组。
我使用hyt
用户就能成功读写test.c
文件了。
chmod命令其实还有别的用法
在上面我们谈到文件访问权限的方法还有八进制数值表示法
我们也可以直接用八进制书来对用户的读、写、执行权限进行修改。
这是用二进制表示法改过来的,因为我们是可以使用二进制位的0或1表示读、写、执行权限是否别允许
补充命令
groupadd
在 Linux 中,可以使用 groupadd
命令来创建所属组。以下是创建组的示例命令:
groupadd groupname
其中, groupname
是要创建的组的名称。我们可以根据实际需求指定组名。
在 Linux 系统中,新建组的相关信息通常保存在 /etc/group
文件中。这个文件包含了系统中所有组的配置信息,包括组名、组密码、组 ID 以及组成员等。
usermod
在 Linux 中,可以使用以下命令将两个用户添加到一个所属组:
首先,需要确定要添加用户到的组名,假设组名为groupname
。
然后使用以下命令添加用户:
usermod -a -G groupname username1
usermod -a -G groupname username2
其中,usermod
命令用于修改用户属性,-a
选项表示添加用户到附加组(而不是覆盖原有的组设置),-G
选项指定要添加到的组,username1
和username2
是要添加的两个用户的用户名。
执行完上述命令后,这两个用户就被添加到了指定的组groupname
中。需要注意的是,这些更改可能不会立即在当前会话中生效,可能需要用户重新登录才能完全应用新的组权限。
groupdel
在 Linux 中,可以使用 groupdel
命令来删除一个所属组。命令格式如下:
groupdel groupname
其中, groupname
是要删除的组的名称。
需要注意的是,只有当该组不是任何用户的主组时,才能成功删除。如果该组是某些用户的主组,删除操作将会失败。
chgrp
功能:修改文件或目录的所属组
格式:
chgrp [参数] [所属组名] [文件名]
常用选项:R -> 递归修改目录文件的权限
说明:该命令只能以超级管理员的形式执行
file
功能说明:辨识文件类型
语法:
file [选项] 文件或目录...
常用选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试去解读压缩文件的内容。
文件掩码
在引入文件掩码这个概念之前,先提一个问题:我们创建文件的默认格式是什么?
我在一个空目录下创建了一个目录文件和一个普通文件,可是我们发现他们的默认权限是不一样,dir
对于拥有者和所属组来说,是可读、可写、可执行的,对其他用户只是可读可执行;而test.txt
对于拥有者和所属组是可读可写的,对其他用户只可读。关于目录权限,下面会谈到,现在先来谈谈普通文件的权限。
我们之前讲过,在Linux中普通文件包含:文本文件,源文件,图片文件,视频文件,库文件,以及可执行文件等。
而对于可执行文件来说,它只是占据系统中的小部分文件,所以创建普通文件的时候默认是没有可执行权限的。那么如果我们将我们创建的文件让它有可执行权限,再执行会发生什么呢?
我将test.txt
文件的拥有者加上了可执行权限,再执行就发生了这样的报错。
由此可得,Linux中,一个文件可执行要满足以下条件:
-
文件具有可执行权限:对于普通文件,所有者、所属组或其他用户至少要有执行权限(通常用 x 表示)。可以使用 chmod 命令来设置文件的权限。
-
文件格式正确:文件必须是能够被系统理解和执行的格式。例如,如果是脚本文件(如 Shell 脚本、Python 脚本等),需要符合相应脚本语言的语法规则。
-
依赖满足:如果执行文件依赖于其他库文件、配置文件或特定的环境变量等,这些依赖必须存在且正确设置。
-
对于二进制可执行文件,其格式要与当前系统架构兼容。
-
执行路径正确:如果要在任意位置执行文件,可能需要将文件所在的目录添加到系统的环境变量 PATH 中,或者使用文件的绝对路径来执行。
简单总结下来就两点:
- 必须拥有可执行权限(x)
- 我们执行的文件必须真的是一个可执行程序
那么回到刚才的问题,我们知道了普通文件创建下来,是不可被执行的,那么应该是可读可写的,为什么这里拥有者、所属组还有其他用户的权限默认一开始不是一样的?以及我们如何更改我们想要的默认权限?
根据我们上面的分析,我们创建出一个普通文件来,应该默认具备读写权限的,就像这样:
即使我们知道创建出来不让其他用户能对我们自己创建的文件进行写操作,是对我们文件的一种保护,那么系统是如何能够默认的让这些文件创建出来是这样的情况:
我们如何更改这种默认设置呢?
umask
功能:
查看或修改文件掩码
- 新建文件夹默认起始权限 = 0666
- 新建目录默认起始权限 = 0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。
原因就是创建文件或目录的时候还要受到 umask 的影响。
假设默认权限是mask,
实际创建的出来的文件权限是: mask & ~umask
格式:umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。
我们来计算一下:
计算出来的结果就是我们新创建出一个文件的权限。
我们也可以通过修改文件掩码来修改新创文件时的权限
同样的道理,我们也可以将文件掩码改为对应我们想要的格式,来创建文件。
目录的权限
我在介绍umask
指令的时候说过,目录的默认起始权限应该是777
那么对于目录而言,读、写、执行权限有什么用呢?
- 可执行权限: 如果目录没有可执行权限, 则无法cd到目录中.
- 可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
- 可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.
于是, 问题来了~~
换句话来讲, 就是只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写(包括root账户创建的文件)
权限.
为了解决这个不科学的问题, Linux引入了粘滞位的概念。
对于文件的拥有者来说,能够删别人的文件也很正常,但如果在Linux下,进行团队开发,每个用户是无法进入其他用户的家目录的,所以我们不用考虑在家目录里会删别人的文件。
可以看到,这两个用户对于彼此的家目录而言都是其他用户,所以如果这两个人想要进行文件共享就不能够在彼此的家目里共享,Linux为这样的场景提供了一个平台目录
就是根目录下的tmp目录
粘滞位
粘滞位是给目录中的other设置一个权限位,具有可执行(x)的意义,同时也进一步对目录权限进行了特殊限定:
在具有粘滞位(t)的目录中,只有root或者文件的拥有者有权进行删除,其他人一概不允许。
示例:
hyt用户在/tmp目录下创建了一个文件
/tmp目录的拥有者和所属组都是root,所以其他普通用户都是other,对该目录的权限是(r w t),此时我切换到hpz用户,来对test_hyt文件进行删除:
此时,我再将tmp目录对于其他用户的权限改为(r w x)
使用sudo分配权限
在 Linux 系统中,sudo
(Superuser DO)的作用是允许授权的用户以超级用户(root)或其他指定的用户身份来执行特定的命令。
使用sudo
具有以下优点:
- 增强系统安全性:通过限制普通用户获取完全的 root 权限,降低了因误操作或恶意操作对系统造成严重破坏的风险。
- 精细的权限控制:可以为不同的用户授予执行特定命令或访问特定资源的权限,实现更细致的权限管理。
- 审计和追踪:系统会记录使用
sudo
执行命令的用户、执行的时间和具体命令等信息,便于进行审计和追踪操作历史。
总之,sudo
为系统管理员提供了一种灵活且安全的方式来管理用户的权限和执行关键操作。
我们在使用sudo指令之前,是需要先使用root账户修改/etc/sudoers
配置文件的,否则直接使用sudo会出现以下错误:
那么如果我们像要一个普通用户能够执行sudo
指令,就需要登录root账户去修改/etc/sudoers
配置文件
我们只需要使用编辑器打开该配置文件,在大概第100行这里,照着root的格式将我们想要设置能够使用sudo指令的用户添加一下就好了
修改完配置文件以后,hpz用户就能够使用sudo指令了