Linux权限的概念
权限就是:一件事情是否允许被谁“做”
权限=人+事物属性
Linux下有两种用户(人):超级用户(root)、普通用户。
超级用户:可以再linux系统下做任何事情,不受限制,且root用户只有一个。
普通用户:在linux下做有限的事情。普通用户可以有多个
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
那这里所说的事物通常在Linux指的就是文件,当然不仅仅指文件,现阶段我们主要先来谈文件,那事物属性当然就对应到文件的属性了。
那在Linux中,文件可以拥有的属性有:可读、可写、可执行。
Linux权限管理
Linux用户分类及切换
用户分类
那Linux用户的分类其实我们上面已经提过了,分为root用户和普通用户
超级用户root:可以在linux系统下做任何事情,几乎不受限制。root用户只有一个。
普通用户:在linux下做有限的事情,普通用户可以有多个。
普通用户—>root
现在以普通用户的身份登录:
那我现在想切换到root,怎么做呢?
指令:
su 或者 su root (root可以省略)
输入root的密码,成功切换到root:
如果我们想退出登录可是敲ctrl+d或者exit就可以退出刚才的登录,又回到普通用户。
观察,我在普通用户的家目录zzy下使用su指令切换为root账号,root此时还在zzy家目录下:
su是单纯的账号切换 ,用户所处的路径不发生改变。
指令: su - 或者 su - root (root可以省略)
可以看到su - 比su 多显示了登录时间,且所处的路径发生了变化,变成了root的家目录/root。
su -
其实是重新登录root,登录后默认所在路径在家目录下。
root—>普通用户
指令: su user
root切换到普通用户不需要输入密码直接可以切换
普通用户切换到普通用户需要输入密码
单条指令的提权
比如,我现在是普通用户:
我想查看root家目录下的文件,但没有权限, 如果不切换成root账号, 该怎么做呢?
指令: sudo
原指令不变,只需在前面加上sudo
就行了,这就是对单条指令进行提权:
根据提示,现在需要输我自己的密码。但是输了自己的密码之后,我们还用不了sudo这个命令, 因为我们的用户不在白名单里, sudo提权只需要输入自己的密码即可,所以需要有一个白名单.
用户角色划分/文件访问者的分类(人)
Linux中还对用户角色进行了划分,或者说对文件访问者的一个分类:
文件和文件目录的所有者:u---User
文件和文件目录的所有者所在的组的用户:g---Group(
其它用户:o---Others
图中的第三列其实就对应文件的拥有者,第四列就对应文件的所属组, Linux其实不不记录other,other可能有很多个,除了拥有者和所属组之外的都是other。
关于文件所属组
文件所属组,这个概念该怎么理解呢?为什么要有文件所属组呢?
假设现在有一个公司,只有一台Linux机器,所有人都在这台机器上开发, 且不同的工作小组在做同一件工作。
那假设现在有两个小组A组和B组,它们在开发同一款产品,现在有两个人,张三在A 组,李四在B组。公司在Linux上创建了两个目录,A_code,B_code,分别让A,B两组存放自己的代码。张三写好了一份代码test.c,张三的组长跟张三说,把你的代码给我看看,我看你写的怎么样。
那我们假设此时Linux中没有所属组的概念,只有文件的拥有者和other。然后张三组长就去访问张三写的test.c,但是由于张三才是test.c的拥有者,A组长是other,所以看不了, 组长没有权限查看张三的test.c文件。所以张三现在给test.c文件开放other的权限,组长就可以看了。但是此时不仅A组长可以看了,B组的李四包括其它人也是other,所以B组的人也可以看了。那这里就涉及到了权限安全的问题。我只是想让我的组长看,但是现在其它组的人也可以看,那这不合理。所以,Linux就顺理成章的引入了所属组的概念。
那有了所属组之后,张三就可以把自己的代码只开组内的权限,这样跟张三一组的人就都可以看了,但是其它组还是other,没有权限,就查看不了。
文件类型和访问权限(事物属性)
文件类型
首先右边几列分别代表:
那第一列的这个字符其实表示的是文件类型
那我们就要知道: Linux不用文件后缀区分文件类型,而是用文件属性中第一列的第一个字符来标识文件类型。
Linux中的文件都有哪些类型呢?那也就对应了第一个字符有哪几种呢?
-:普通文件(指不包含有文件系统信息的结构信息的文件,是用户所接触到的文件,比如常见的.exe,.c,.txt,归档文件等在Linux中统称为普通文件)
d:目录(文件夹)
(ps:前两个是最常见的)
l:软链接(类似Windows的快捷方式)文件
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接字文件
文件后缀
那认识了文件类型之后,我们来思考一个问题,上面说了Linux不以文件后缀区分文件类型,那今后我们在Linux中该如何去看待文件后缀这个东西呢?
今后我们自己创建文件的时候照样可以加对应的后缀,想用就用,因为这个是给我们自己看的,给人看的。在Linux中我们可以将后缀看成文件名的一部分。
但是:
现在在我当前这个目录下有一个.c文件,里面有一段C语言代码, 并且它编译生成的可执行文件也是可以正常运行的:
Linux不用文件后缀区分文件类型,那我就可以这样做:
a.out改名,改成a.txt,那它不会改变类型,还是可执行文件,还可以正常执行.
现在把test.c 改成test.txt,里面还是这段代码,然后那我们再用gcc编译它:
看到报错说文件格式不能被识别。
不是说Linux不以文件名区分文件类型嘛,那这里为啥一改后缀就不行了呢?
我们上面说的是Linux不以文件后缀区分文件类型,那这里的Linux指的是操作系统,也就是说操作系统不以文件后缀区分文件类型。
但是我们刚才的指令是gcc test.txt
Linux操作系统不以文件后缀区分类型(Windows是以文件后缀区分类型的),并不代表gcc(Linux中的C编译器)或者其它的一些软件不以文件后缀区分文件类型啊。
基本权限
基本权限
i.读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
ii.写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
iii.执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
iv.“—”表示不具有该项权限
以test.txt为例,怎么去描述它的权限呢?我们上面说了,权限等于人+事物属性。
对于它的拥有者来说,权限是
rw-
,即可读可写,所属组的权限是可读r--
,other的权限也是可读r--
。另外,它的拥有者是zzy这个用户,所属组也是zzy。
所以zzy就是拥有者和所属组,那其它的用户就是other。
所以我们描述一个文件的权限的时候,一定是描述它的拥有者、所属组、other分别有什么权限,它的拥有者和所属组都是谁。(即人+事物属性)
这才是对一个文件权限的一个完整描述。
了解了文件的访问权限,如何去修改的权限呢?
那我们说了权限=人+事物属性。
那对应Linux中就是用户+文件属性。
所以,我们要修改权限,那要么修改用户,要么修改文件属性。
先从文件的属性下手:
以test.txt为例,我当前登录的用户就是该文件的拥有者,所以我是可以修改文件的权限的,一般来说只有文件的拥有者和root才可以修改文件的权限。
指令: chmod [参数] 权限 文件名
功能:设置文件的访问权限
常用选项:
-R : 递归修改目录文件的权限,即对当前目录下的所有文件与子目录进行相同的权限变更.
说明:只有文件的拥有者和root才可以改变文件的权限
命令权限值的格式:
用户表示符+/-=权限字符:
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
用-将文件权限删除:
可以一次操作多个角色
用+添加文件权限:
也可以一个操作单个角色
用=赋予文件权限:
文件权限值的表示方法
上面我们讲到文件的三种权限读、写、执行的表示可以用三个字符r\w\x表示,那这种表示方法我们把它叫做字符表示法:
除此之外呢,其实还有另外一种表示方法——8进制数值表示法:
给test.txt去掉所有权限:
添加所有权限:
添加部分权限:
文件的权限
可以看到既不能查看文件内容也不能修改文件内容, zzy虽然是拥有者,但我没有任何权限。
权限可以约束普通用户,但不能约束root
目录的权限
可执行权限x
如果目录没有可执行权限(x),则无法cd到目录中:
可读权限r
我们发现去掉r后,不能ls查看目录内容了,但依然可以创建文件.
可写权限w
发现不能在目录中创建文件和删除文件了。
更改文件拥有者和所属组
指令:chown [参数] 用户名 文件名
功能:修改文件的拥有者
-R : 处理指定目录以及其子目录下的所有文件
发现zzy虽然是这个文件的拥有者,但不能修改拥有者。
强制转让的话,谁有这个能力? 当然是root:
可以用sudo的话用sudo也可以,不用切换,直接单条指令提权。
更改文件所属组也是相似的:
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
如果想同时更改拥有者和所属组呢?
总结:
可执行权限
x
: 如果目录没有可执行权限, 则无法cd到目录中
可读权限r
: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容
可写权限w
: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件
一个文件一定是属于一个目录的,一个文件属性能不能被查看是由目录的r权限决定的,一个文件能不能被删除和能不能新建文件,是由目录的w权限决定的,能不能进入目录是由x权限决定的.
关于默认权限
新建一个文件和文件夹:
发现新建出来文件的默认权限是664, 目录的默认权限是775
这里664和775只是在我当前所用的机器上(我用的是云服务器,centos7.6)是这个结果,可能在不同的操作系统上这个默认权限是不一样的。
权限掩码——umask
为什么默认权限是这个值呢?这和权限掩码有关:
先引入起始权限的概念,起始权限是系统设定的, 普通文件的起始权限是666(rw-),目录文件的起始权限是777(rwx).
那我们创建出来文件所看到的默认权限是怎么得到的呢?
Linux系统为了更好的控制权限,会提供一个默认的权限掩码,我们称之为
umask
。
在Linux中,系统默认是有自己的一个权限掩码的,通过umaks
这条指令既可以获取这个权限掩码:
那这个权限掩码我们可以认为是一个8进制数字(以0开头)。
那八进制002转换为二进制就是000 000 010
而我们的起始权限也是一个八进制数字嘛,这样它们正好可以一一对应。
我们现在知道普通文件的起始权限是666,二进制就是110 110 110
权限掩码是是000 000 010
权限掩码是怎么起作用的呢?
文字表述: 取消权限掩码二进制位为1所对应的权限,如果原权限为0,那么权限仍保持为0.
用公式表达: 默认权限(最终权限) = 起始权限 & (~umask)
对于普通文件来说,我们上面看到默认权限是664。
那普通文件的起始权限是666—>110 110 110
权限掩码000 000 010
,~(按位取反)之后是111 111 101
两者进行&结果是:110 110 100 (664)
对于目录, 目录默认权限是775—>
111 111 110
目录起始权限是777—>111 111 111
权限掩码取反是111 111 101
起始权限 & (~umask)结果是: 111 111 101 (775)
修改权限掩码
权限掩码是可以修改的,如果把权限掩码改成0007:
权限掩码0007—>000 000 111
取反为:111 111 000
文件的起始权限666—>110 110 110
此时普通文件的默认权限:起始权限 & (~umask)为
110 110 000—>660 (rw-rw----)
目录的起始权限为777—>111 111 111
此时目录的默认权限为:
111 111 000—>770 (rwxrwx---)
符合计算的结果
粘滞位
我们在使用Linux的时候呢,有时候就可能需要一些共享目录,多个用户在同一目录下进行操作, 即目录被所有普通用户共享,用来保存普通用户产生的临时数据。
我们知道所有普通用户的家目录都是在home目录下的,那这个home目录其实是属于root的。
创建的所有普通用户,它们的家目录都是在home下面的:
那这里的zzy就是我的家目录,我未来创建的所有文件都是在我的家目录里面的,而且只有我对我的家目录是有rwx权限的,其它的任何一个普通用户对我的家目录都是没有任何权限的。
那假设现在我家目录里面有一份数据,那现在testuser这个用户也想来看一下这份数据。
那是不可能的,testuser这个用户没有权限,因为他是other,根本无法进入我的目录,更别谈看我家目录里面的文件了。
但是我们可能有这样的需求,就是让多个用户去交互它们的数据。我们就可能需要一些共享目录,把需要共享的数据放在共享目录下,所有的用户就都可以查看了。那在Linux中,这个共享目录一般是由root提供的,只要root把权限放开,那其他普通用户就可以以other的身份去访问这个目录了。
此时我就创建好了一个公共目录public。
我们看到它的一个默认权限是755,这和root下的umask肯定是有关系的。
既然要创建的是公共目录,就把它所有的权限都放开:
在这个共享目录里面,不同的用户也就可以实现数据的共享了:
因为testuser对test1.txt文件对other开放了r权限, zzy用户可以查看test1.txt文件
但他并没有对other 开放w权限,所以我们即使处在共享目录下,也还是会受到权限的约束,这也很正常,因为我和ymm都是普通用户。
假如出现这样的情况:
testuser用户把test1.txt的所属组和other的权限全部关闭,不让其他用户看和写.
既然你不让我看,也不让我写, 那我可以删除文件吗?
可以看到是可以把文件直接删除掉的, 因为这是共享目录, other对该目录有w权限, 而所有用户的文件都放在这个目录下。即使我看不了也写不了别人的文件,但是我可以把它删除掉。
所以,在共享目录里面,文件被所有用户共享的时候,会受到权限约束,但是拦不住别人删你的文件, 显然这是不合理的.
那为了解决这个问题,Linux就引入了粘滞位的概念。(因此我们也应该知道,粘滞位只能给目录添加)
指令: chmod +t 目录名
添加粘滞位也需要root,或者使用sudo:
最后一位由
x
变成了t
,而t就表示该目录被添加上了粘滞位。
再想删除其他用户的文件就不行了:
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由:
一、超级管理员删除
二、该目录的所有者删除(一般是root)
三、该文件的所有者删除