前言:在Linux中,每个文件或目录都有一个所有者和一个所属组。文件权限基于这两个标识符进行管理,通过为所有者、所属组和其他用户分别分配权限来控制文件的访问。这种权限分配方式提供了细粒度的控制,只有被授权的用户才能对文件进行读取、写入和执行操作。通过对文件的所有者、所属组和其他用户分配不同的权限标志,实现了对文件访问的细粒度控制。这种权限模型为保护文件的安全性和隐私性提供了重要的机制。
目录
Linux下有两种用户:超级用户(root)、普通用户。
超级用户:可以再linux系统下做任何事情,不受限制,一个服务器对应的root只有一个。
普通用户:在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
命令:su [用户名]
功能:切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令。
1.在root模式下创建一个新的普通用户
在root模式下,使用命令adduser [用户名] 来创建一个普通用户,使用passwd [用户名] 来为新创建的普通用户修改密码,注意,普通用户的密码尽量不要与root账号的密码一致,因为root的权限太高,我们平时一般不会使用root操作,如果root账户和普通用户的密码一致,万一误误操作可能会导致修改了root账户里的数据。
2.两种登录方式
退出root账号,采用命令
ssh [用户名]@[云服务器的IP]
输入密码直接登录即可。
第二种,就是直接创建一个快捷方式,避免每次都使用命令登录,我们点击XShell中左上角的新建图标
在上面的窗口中输入主机IP,也就是我们的云服务器的公网IP,起个名字,确定即可。
接着我们就可以使用左侧边栏中的标签直接登录了,首次登录需要输入该用户的用户名,接着直接输入密码登录即可。
命令:su
功能:单纯地将用户从普通账户切换到root账户,自身还是在原来的目录下
命令:su -
功能:直接在普通用户里重新登录root账户,此时目录就变成了root下的目录,后序可直接按ctrl + d 退出登录。
对于root用户转变为普通用户则较为简单,直接采用 su+[用户名]即可转换,root账号不受权限约束,可以随意变换自己的用户。相应的,从普通用户转换为另一个普通用户,就需要知道对方的密码方可转换。
如果我们想在普通账户下只执行一条权限高的指令,我们可以用sudo来将指令进行提权,也就是模仿root来操作文件。
这里出现了信任白名单问题,我们知道root用户不受权限约束,如果向上述一样的操作,那么相当于每个普通用户都可以任意的操作root用户来为所欲为,这就会让和当前用户同时使用的同一台云服务器的其他普通用户难受了,“万一哪一天他通过root操作把我直接给删了怎么办?”,所以,指令提权只能对root所信任的普通用户使用。
如果你想要这个权限,那就只能找root用户来将自己的用户名添加到文件sudoers文件里了,一旦添加进去,就代表root用户无条件信任这个普通用户了。
那么,root用户又该如何添加呢?
这里目前我们所掌握的,还实现不了,这里就简单说一下,
1.在root用户下,输入命令 vim /etc/sudoers
2.出现文件后,输入 i 切换为插入模式,找到下方的信任列表,在下方添加自己的用户名即可,其他复制过来即可。
3.键盘输入esc,再输入:wq! ,强制保存并退出即可
这样,我们发现我们的普通用户账号就可以"为所欲为"......,那个,更高的权限操作了。
在Linux下,一个文件的权限与三类角色有关,分别是:
文件和文件目录的所有者:u---User(中国平民 法律问题)
文件和文件目录的所有者所在的组的用户:g---Group(不多说)
其它用户:o---Others (外国人)
文件所属组这个概念不太好理解,这里我们来讲一下,
文件所属组作为一个文件独立于拥有者和其他人的角色类型,本质上可以将一些有需求的其他用户拉进自己的所属组来操作自己文件的同时避免任意的其他用户访问,可以细化角色的权限,更好管理。比如,在下面的场景下使用所属组,
权限的表示方式是使用一串由r、w、x和横线(-)组成的字符串,共有九个位置,分为三组。第一组是所有者权限,第二组是群组权限,第三组是其他用户权限。
例如,-rwxrwxr-x
表示文件的所有者具有读、写、执行权限,群组用户具有读、写、执行权限,其他用户具有读和执行权限,而没有写入权限。
i.读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
ii.写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
iii.执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
chmod
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项:
R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限,并且root不受文件权限的约束,可以直接修改任何文件的权限。
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
这些符号可以同时使用,但是需要注意,两个命令之间加逗号分隔,如 a+rw,o-wx
验证普通用户之间的文件访问权限
首先,我们有三个用户,分别是lj、lj_tmp和root,我们在lj用户下新建一个test_9_15目录,并且在该目录下新建一个文件test.txt ,我们想知道lj_tmp用户能不能访问lj用户的文件,首先我们知道,除了root之外,不同的普通用户之间是不能互相访问的,但是我们前面学习了su命令,可以自由切换用户,我们可以在root用户的目录下,切换别的普通用户,在root权限的引导下达到在root原来的目录下使用其普通用户访问其他普通用户文件的目的。
用户权限匹配一次原则
对于我们的每一个用户,文件识别其身份并确定其类别是所有者,所属组和其他只会匹配一次,举个例子,对于文件拥有者来说,我们修改所有者的写权限使其不能向文件中写入内容,但同时我们的文件的所有者还是所数组的组长,但是我们的文件并不会仍旧对其放开其对文件的写操作,因为其已经归为所有者一类,权限就只由该类对应的权限有关,与其他类的权限无关,不管该用户是不是在其它类中存在。
直接使用三位8进制数字来表示三个类别的状态,其中,0表示该位置上的权限未被放开,1则代表该位置上的权限是放开的,
例如 100表示的状态就是三个类别的成员的权限分别是1,0,0,也就相当于 --x --- ---,对于权限来说,每个位置代表的权限含义是固定的,也就是 rwx rwx rwx的形式,每个位置上要么是原字母,表示有这个权利,要么就是 - ,表示没这个权利。
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
把文件给别人是要征得别人同意的
一个普通用户把自己目录下的一个文件给别的用户,甚至是root用户都是需要对方进行授权统一的,这就比较麻烦了,但是我们之前学过sudo的提权指令,我们可以模仿root发出给与文件的命令,你不要也得要,这样就可以直接给到对应的用户文件了,同时文件对应的拥有者也会变成对方,但是所属组依然是你自己,同样的,我们也可以直接切换成root用户,直接就可以操作,前提是你自己是root。
同样的,我们还可以把文件再“要回来”,还是执行同样的指令,
功能:修改文件或目录的所属组(file [文件] 可以查看文件的属性)
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
类似于上面的chown的方法,我们仍旧需要采用指令提权的方式来实现文件所属组的修改,使用我们的chown,还可以同时修改文件的拥有者和所属组。
功能: 查看或修改文件掩码
新建文件夹默认起始权限=0666(0不考虑,一般只看后三位)
新建目录默认起始权限=0777
格式:umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。
超级用户默认掩码值为0022,普通用 户默认为0002。
我们在Linux下创建一个文件和一个目录,我们看到对应的文件权限掩码分别为664和775,这个规则是如何建立的呢?我们就需要来了解umask,创建文件或目录的时候还要受到 umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask,
我们可以自己计算一下,我们此时是普通用户对应的umask=0002,与三类文件角色权限对应就是二进制 000 000 010 ,按位取反 ~umask = 111 111 101,此时,
创建目录文件,则其默认权限= 111 111 111 & 111 111 101 =111 111 101 =775,同理,对于文件夹,默认权限就是 110 110 110 & 111 111 101 =110 110 100=664。
对于一个目录文件来说,单纯只是进入一个目录,其权限只与执行权限x有关,对于目录的r权限的作用,在于能否查看目录下的文件内容,对于w权限,决定是否允许一个用户在当前目录下创建文件。这里就不再做演示。
一个文件,不论其实目录还是文件,其一定是属于某个目录下面的,一个文件的属性能不能被查看,是由目录的权限决定的。一个文件能不能被删除,和文件本身没有关系,只与文件所在的目录的权限有关系(所在目录文件是否有w权限,"毁灭你与你何干”)。这也是为什么目录的权限掩码是775,相当于去掉了other的写权限,这样可以保护自己的文件不被任何除root以外的用户恶意删除。
这样,我们个人的普通账户还有什么私人空间可言,就像上面说的那样,如果别的普通用户进入了我的目录,不就可以随意修改我自己的文件了吗?
一般而言,这是不会实现的,
首先,上面的种种一个普通用户进入另一个普通用户的操作,前提是在两者处在同一个目录下才实现的,我们知道,普通用户都保存在home对应的目录中,我们查看一下对应的成员文件属性,
每一个用户作为目录文件,其权限被默认设定为了700,也就是只有自己有权限,本质上就是其他的普通用户根本就无法直接进入另一个普通用户的目录,直接在第一层就被阻挡了,他连门都进不来,何来篡改自己文件以说。
第二,上面的操作得以实现的原因,是因为在使用另一个普通用户,想要对该普通用户的文件操作之前,我采用了作弊手段,直接将账号切换为root用户,先到达了对应的目标文件的目录下,接着切换回普通用户才得以继续操作,上面也说了普通用户没有直接进入另一个用户目录的权利。
在公司中,我们经常会遇到需要多人协作的工程项目,这就不得不将两个或以上的普通用户联系起来,但是我们上面已经明确声明,普通用户之间没有相互访问的权利,那该如何是好呢?
既然,去不了私人的家,那就找一个公共场合怎么样?
我们可以在公共区域建一个目录,将这个目录的权限放开,也就是修改文件权限掩码为777,这样我们就可以使用不同的用户同时协作在一个文件下操作了。
利用root在根目录下创建共享文件,然后将该文件的文件权限设置为777,注意一定是根目录,不是root目录下,
这样我们就可以直接使用两个不同的用户在同一个目录下进行协作了。
上面的过程,我们可以发现一个弊端,就是普通用户一旦创建文件,就相当于将这个文件正大光明的放在了公共区域,如果以后有其他的普通用户进入这个公共目录下,恶意删除这些多人协作的文件呢,这该怎么办?
粘滞位
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由:
一、超级管理员(root)删除
二、该目录的所有者删除
三、该文件的所有者删除
有root用户设置共享文件目录的粘滞位,
目录的可执行权限是表示你能否在目录下执行命令。
如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目录, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件) 而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
努力是个缓慢积累的过程,先有量变才能引起质变,所谓努力,只不过是把别人用来聊天、刷段视频和看剧的时间都用在学习和成长上,每一分你在人前的轻松如意,都源于背后的暗自努力。时代淘汰的就是不努力、不上进的人,你不卷有人卷,到了上岸的时候,你上不了岸有人就能上岸。