目录
Linux中的用户
Linux中的用户分为两种,一种是root用户也就是超级用户,一种是非root用户也就是普通用户。root用户在Linux系统中拥有着极高的权限,基本不受约束,可以说是想干嘛就干嘛,而普通用户就会受到不少权限的限制。
用户账户之间的切换
有时我们在使用linux主机时会想要临时切换用户获取对应的权限完成对应的一些操作,这是要怎么做呢?
su
su [选项]想要切换的用户名
su指令可以用于用户账户之间的切换,su后面跟上想要切换的用户账户名就能实现切换。当我们su后面什么账户名都没写时默认就是root账户。当我们是以普通账户的身份转到其他账户时,必须要输要转到的对应的账户的密码;但当我们时root账户时,转到其他账户无需输入密码,想怎么转就怎么转,这是root账户高权限的一种体现。当我们使用完账户时,可以使用exit指令或热键ctrl + d退回到上一个账户,如果我们转了多次用户,也是可以多次回退。
注意当我们使用su指令不使用选项时,su指令就是一种账户切换,这点从所在路径就能看出来,su指令切换账户不会改变所处路径,切换完账号还在原来的路径下。如果我们想要达到重新登录的效果,可以加上选项-,
su -想要切换的用户名
这是我们就发现切换完账户之后所在的家目录也变了。
sudo
sudo 想要提权的指令
有时我们在普通账户下仅仅只是想要对单一指令进行提权,不想要切换账户,怎么办呢?我们可以使用sudo指令对单一指令进行提权,这时指令就会以root的身份跑了。但是,这里有一点要注意的是,但我们使用sudo指令时,系统会提示我们输密码,但是奇怪的是这里要我们输的是自己账户的密码,我使用root账户权限不是应该输root账户的密码吗,怎么会输自己的就行呢?这不是有安全隐患吗?其实不然,我们会发现,在没有加入系统白名单的情况下,使用sudo指令即使输入了自己的密码还是会报错,因为这个账号不在白名单中。系统的白名单只能由root账户设置,所以未经允许的用户即使使用sudo也是不能成功的,只有被root账户设置在白名单中列为信任账户时才能使用,Linux以这种方式保护系统安全。
Linux中的文件权限
我们在使用 ls -l(ll) 指令时,会看见文件前面很多参数,这些参数是什么呢?下面详细讲一下。
Linux下的用户与角色
Linux 中的用户是系统操作的主体,拥有唯一的身份标识,权限基础与专属的环境。而角色又是什么呢?我们看向Linux中 ls -l 打印出来的详细的文件信息,
我们看向那两个thx,我现在所处的账号是thx普通用户,那两个参数的第一个是文件的所属用户,第二个是文件的所属组。对于文件来说,所有的用户都会被划分成三种角色,拥有者,所属组,其他用户。角色是权限的抽象集合,Linux将特定操作权限打包成一个逻辑单元,再分配给用户/进程。我们在创建文件时,使用的什么账户,文件的所有者就是自己这个账户,关于所属组,我们在创建用户账户时自动生成同名私有组,在创建文件时会自动将文件默认归属该私有组。在Linux中有组这个·概念,多个用户可以属于同一个组,可以共同查看一些只有属于这个组才能有权限访问的文件。
文件的权限查看
看完了第二和第三个参数,我们看看第一个参数,这个参数看起来就是一堆乱码,其实蕴含了很丰富的信息。
文件类型
第一个参数的第一个字母表示了该文件的类型,不同的字母代表了不同的意思:
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
可以看到Linux有着很丰富的文件类型,但是其实最常用最常见的就是第一个和第二个也就是目录和普通文件。
文件的基本权限
文件的基本权限有三个,分别是读权限(r),写权限(w),执行权限(x)。可以发现,这些参数与我们文件信息的第一个参数除第一个字母之外的其他字母吻合。这9个字母每三个一组自前而后分别表示文件所有者,文件所属组,其他用户对这个文件的权限,如果对应的文件权限存在就是直接显示这个字母,如果不存在就是只显示一个-。
比如这里,对于普通文件1.zip,其拥有者有读权限和写权限,其所属组有读权限和写权限,其他用户就只有写权限。而对于目录d1,其拥有者有读权限,写权限和执行权限,其所属组也有读权限,写权限和执行权限,而其他文件就只有执行权限了。
文件的权限更改
chmod
chmod [参数] 权限 文件名
chmod可以改变文件的访问权限,其选项可以以用户表示符+/-=权限字符的方式表示权限的设置,下面是字符所代表的意思:
:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限(覆盖不是增加)
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
比如我想给test.cpp的所有角色都设置成rwx,我就可以,
注意用户表示符+/-=权限字符之间不要有空格。
当然,chmod不仅可以以这种方式改变权限,我们还能以八进制的形式更改。我们都知道,每一个角色的权限都有三个,即rwx,如果我们用三个比特位来表示,如果有就是1,没有就是0,那么就会变成一个三个比特位表示的数,最高是7,八进制。rwx就是7,rw-就是6,r-x就是5,r–就是4,-w-就是2,–x就是1,以这种方式来表示权限的话,就是总共三个八进制的数,chmod也是支持这种表示方式的,
可以发现,这样的表达方式其实更加简洁明了,我们在实际使用时用这种方式更多。-R可以递归更改指定文件下的所有文件的权限。
chown
chown [参数] 用户名 文件名
chown可以改变文件的拥有者,在Linux中,改变文件所有者必须以root权限才能改,普通用户即使是文件所有者也不能改,文件所有者有权更改文件的权限,但没有权限更改文件所有者。所以这里可以用su转换身份使用这条指令,或者sudo一下。-R可以递归更改指定文件下的所有文件的所有者。
chgrp
chgrp [参数] 用户组名 文件名
chgrp可以更改文件的所属组,在Linux中,更改文件所属组同样需要root权限。-R可以递归更改指定文件下的所有文件的所属组。
文件的初始权限
我们在创建文件时,会发现文件在创建时有一个默认权限,
对于目录,初始权限是775,对于普通文件,权限是664。为什么是这么个初始权限呢?我们不妨想一想这个权限的合理性。
普通文件与目录文件的权限
对于普通文件来说,664意味着其拥有者和所属组都能对这个文件进行读写,其他用户就只能读,所有角色都不能执行该文件。这其实挺合理的,因为可执行的文件只是少数,大部分文件都不能执行,我们在写完代码由编译器编译完之后也会自动生成有执行权限的可执行文件,这些由系统管控,我们不用担心。只允许拥有者和所属组修改,其他用户只准看一眼也很合理。但是对于文件呢?对于文件来说,rwx分别意味着什么呢?我们不妨来测试一下。
我们先移除掉目录的r权限看看会怎么样,
可以看到,移除掉目录的r也就是读权限,我们就不能使用ll查看目录内部的文件与目录了,r权限代表是否允许我们查看指定目录下的文件内容。
那w权限呢?
可以看到,移除掉w也就是写权限,我们就不能在目录中创建删除修改文件与目录了,w权限代表是否允许我们在当前目录下进行创建,修改,删除。
那x呢?
可以看到这次直接进不去了,所以x权限代表着是否允许用户进入对应的目录。其实这时我们进不去,但是理论上我们可以不进去通过路径访问里面的内容,因为rw权限还是在的,但也会受到限制,因为修改这种操作默认要先进到里面去才行。
这一圈验证下来,我们也就能理解目录初始权限这么设置的原因了。读写权限自不必多说,对于x权限,无论是所有者,所属组还是其他能有x权限,因为要保证大家都能访问这个目录,所以必须得有。
权限掩码
上面分析了Linux给普通文件与目录设置664与775权限的原因。但是实际上,在普通文件与目录创建之初,它们其实还不是775和664,它们其实是777和666,可他们为什么变成了775和664呢?答案是权限掩码(umask)。
在Linux中我们可以通过umask指令直接查看权限掩码,
我们可以看到,系统默认的权限掩码是0002,第一位我们可以先忽略,用的很少,那就会变成002。在我们创建文件时,系统会确保权限掩码所对应的权限不会出现在所创建的文件中,002对应了-------w-,这个权限掩码会屏蔽掉我们创建文件的其他用户的写权限。这也很合理,其他用户系统默认不给他修改文件内容来保护文件。所以我们就明白了,目录和文件一开始创建时就是777和666,只是经过了umask的处理,推测大概是用了位运算,按位与这种的运算,使他们变成了775和664。
对于权限掩码,我们其实还能进行更改,
直接umask后面跟想要修改成的权限掩码就行了,这时我们再创建文件,
会发现对应的权限被自动屏蔽了。Linux允许我们自定义权限掩码,让我们可以更方便的保护系统安全,是一个很好的设计。
创建一个共享目录
我们普通用户的家目录一般都是700的权限,
也就是root用户外其他的用户完全没法对其进行操作,这很合理,自己的家目录当然要保护好。那么就有一个问题了,假如我们是一个项目组,共用一台主机,如何弄一个我们整个组都能访问修改的共享文件夹呢?家目录里肯定不行,其他用户进都进不去,我们可以在根目录下创建一个。因为是共享的,我们可以将其权限设置成777。
这时我们切换成普通用户也能进入目录在其中创建修改删除文件。这看起来很美好,但是还是有一个问题,就是假如我创建了一个文件,很重要,我不想让除了root外的其他人对其进行任何操作,于是我将其设置成了700的权限,这时别人就一定不能动这个文件了吗?其实不是,
可以看到,temp用户身为其他用户,不能看这个文件,也不能写这个文件,但是我可以删除这个文件。为什么呢?因为一个文件能不能删不是由它自身决定的,而是由它所在的目录所决定的,普通文件的w权限只管文件内容的修改,目录的w权限决定其内部的目录、文件的创建、更改、删除,这里的更改是指的重命名这样的操作,文件内部的更改管不到。所以这就是一个很严重的问题了,这种共享文件的方式管不了别人的删除操作,万一哪天主机的某个用户账户被盗,别人直接恶意清空目录怎么办?w权限不仅管删除,还管创建,去掉文件都创建不了也不现实。这时就要使用粘滞位了。
粘滞位
使用指令:
chmod +t 目录名
可以为指定目录添加粘滞位,添加完粘滞位之后的目录中的文件只能由:
(1)超级管理员删除
(2)该目录的所有者删除
(3)该文件的所有者删除
不过一般来说由于目录创建在根目录下,文件的创建只能由root用户完成,所以1和2一般来说是重叠了。使用完粘滞位之后,我们会发现该文件的信息变成了,
文件信息中第一个参数的最后一位原本是x的变成了t,这也表明t是一种特殊的x权限。这时我们自己创建的文件就不会在被别人随意重命名或删除了。
当然root还是可以想删就删的,这也再次印证了文章开头所说的root拥有极高的权限,在Linux中几乎可以说是想干嘛就干嘛。