Linux权限

目录

Linux下的基本用户

权限的概念

如何操作权限

默认权限规定


Linux下的基本用户

Linux下有两种用户:超级管理员(root)和 普通用户

root的权限非常高,几乎可以做到任何事情,而普通用户就要受到权限的约束。

超级用户的命令提示符是“#”,普通用户的命令提示符是“$”

我们也可以在两种用户之间切换:

1、普通用户切换root:

我先登录普通用户bc,再切换root。

用su命令,+root密码就可以完成切换。

su - 也可以实现,不同之处在于su (root)是还处于原来路径底下,但用户切成了root。

而su - 则是重新加载到root路径底下。

Linux权限_第1张图片

2、root用户切换普通用户

root权限非常高,它切换时不需要输入普通用户的密码!

 如果我们不想切换成root用户,只是想短暂获得root权限执行命令,可以用sudo指令,距离sudo最近的一条指令默认获得短暂提权。

在提权之前只需要输入你现在使用的普通用户的密码,就可以获得5~15分钟左右的root权限,不需要再次输入密码。

Linux权限_第2张图片 

但是很多人发现自己输入密码后无法获得提权:

 这是因为系统不信任此用户,所以不会给你root权限。相当于在系统白名单上的用户可以无条件获得root提权,不在此上的用户没有权利。

如何获得,只需将用户添加到/etc/sudoers中即可。

有的人会问:既然提权可以获得root权限,那么直接所有命令都加sudo,不是等同于root用户了吗?为什么系统不直接给权限,这样操作还省去了麻烦。

————其实在普通用户和系统之间加一层提权操作,是为了更好地监管用户,系统相信用户,放给用户root权限,但是不代表无条件支持所有操作(尤其是非法的),sudo命令是让用户在需要提权时才能拿到对应权限,这样可以有效地防止用户滥用权力、非法操作,便于系统监管。

权限的概念

一、什么是权限

不仅是在计算机系统层面,生活中很多地方也有权限的概念。比如在爱奇艺上追剧,有的剧就有VIP限制;又如在公司,底层员工无法随意进入CEO办公室,只有CEO可以,这些都是权限。

还有一点,上面说的是对于人的权限,还有事物本身的。比如我们无法在爱奇艺上敲代码,这是针对事物来说的的权限。

所以总结一点:权限不仅是对人,还有对物。也就是说,权限是指一件事情是否允许被谁做。这里“谁” 指代人,“做” 指代目标事物。就像Linux下的文件,它的权限 = 人+文件属性。

二、人的权限

人的权限与他所扮演的角色有关,比如你可以看爱奇艺上的VIP电视剧,不是因为你是谁叫什么,而是你在爱奇艺的角色是VIP,因此有这种权限;  你能随意进出CEO办公室,不是因为你是谁叫什么,而是因为你在公司扮演的角色是CEO。

同样在Linux在,也有这种角色之分:owner(拥有者)、所属组(grouper)、other(其他人)

以文件为例:owner就是文件的拥有者,是它的最高权限人;所属组顾名思义,就是属于owner这一组的人,他可以接收owner给予的权力,从而获得文件的一些权限;other属于其他人范畴,权限较小,也就是局外人,一般是不能对文件进行操作的。

那我们的用户和这一块的角色有没有冲突呢?————不仅没有,反而是相容的概念。

比如用户bc是文件a的拥有者,而用户zhangsan是other,系统会自动将用户划分到不同的权限区域里,不是因为bc具体是谁而划分,而是因为它的身份是owner,也有可能zhangsan 是文件xxx的owner,bc是other,所以具体是看扮演的角色系统进行划分的。

Linux权限_第3张图片

 root下查看test文件的信息,它的owner是root,所属组也是root,切换到bc用户,查看test文件,发现它的owner和所属组都是root,因此bc用户就是test文件的other。

owner和other我们都可以理解,那为什么会存在所属组呢?

举个小例子:

有个小公司要开发一款新软件,内部竞争,哪个组做的好采纳谁的。假设公司穷的只有一台Linux机器。

A组成员小明觉得自己做的东西没问题了,他的师父XX想看看他写的代码,如果没有所属组的概念,小明用户对于Linux来说是该文件的owner,其余所有人都是other,因此他要让师父XX看到,就需要开发other权限,让other能看到自己写的代码。此时师父XX是能看到了,但是其他组的成员也一样能看到了(只有一台Linux),此时就泄漏了。

上面只是举个小例子,现实中不会发生。因此所属组的存在就是在owner和other之间建了一堵墙,所属组相当于owner自己人,owner可以开放grouper的权限,同时封闭other的权限。

三、文件属性

文件有3种基本属性:r(读)、w(写)、x(执行)

Linux权限_第4张图片

 第一个字符指代的是文件的类型。Linux下文件的类型和Windows下有很大不同。

Windows下以后缀名区分文件,像.txt是文本文件,.jpg是图片类型文件.......

而Linux下不以后缀名区分文件,也就是说Linux系统看来,a.txt和a.out是一样的。

Linux权限_第5张图片

 我们将test.txt文件改成k.out并执行,发现没有问题,说明Linux系统确实不以后缀名区分文件。

当然,我们可以在Linux下使用后缀名,仅仅是方便我们区分。

那Linux通过什么来区分呢?————就是上面说的 ll 显示的众多属性列中第一列的字符区分。

 第一个字符:Linux权限_第6张图片

 普通文件和目录文件我们见得太多了,下面说说其他几个。

c:字符设备文件:通常是键盘、显示器文件。

 d:块设备:通常是指磁盘。

Linux权限_第7张图片

 

 l:链接文件:类似于Windows下的快捷方式。

快捷方式删了,相应文件还在。

Linux权限_第8张图片

 

 p:管道文件:

Linux权限_第9张图片

 我们复制ssh会话窗口,相当于两个终端。在左侧建立管道文件,同时在右侧也会有,在左侧打印hello却出现在了右侧终端,实际上就是通过管道实现的。

再看一点:

当我们将原本的test.cpp文件改名成了test时,用gcc编译的时候发现不认识。这时候有人会问不是说系统不以后缀区分文件吗?   ————这里与上面说的Linux系统不一样,这里是gcc不认识,gcc是工具当然需要后缀名对应了,所以不要搞混了。

第一个字符代表文件类型,其余9个字符代表的是文件的 r w x 属性。

去掉第一个 - ,后面9个三个三个为一组(分别对应owner、grouper、other):

 每一组又是r(读)、w、x, - 代表的是没有该属性,以owner为例来说:

r:有读属性,w:有写属性,- : 无执行属性。

所以属性为:

test文件的上一次修改时间:xxx; 大小为0 ; owner是root,grouper是root;

类型是普通文件,owner有读写属性,无执行属性;grouper和other有读属性,无写属性和执行属性。

 

如何操作权限

上文说了权限包括人的权限和文件属性,那么操作权限也要注意这两点。

先来看一下如何改变文件的属性(用chmod指令):

 1、去掉owner用户的读写权限:

 2、去掉grouper用户的写权限:

3、增加other用户的操作权限:

 4、增加owner的读权限,并去掉other的操作权限:

 5、去掉所有用户的所有权限:

 

注意:1、只有在对应用户或者root用户下才能操作对应的owner、grouper、other的 rwx 权限;

           2、如果去掉了owner的读权限,不能以grouper身份读取。因为系统底层身份匹配时,先看是不是owner身份,是的话,只会以owner身份进行rwx 操作。

           3、 root用户可以执行上面的所有操作,它不受权限限制。

除了上面的 ugo+rwx 方法,还有一种八进制法可以修改权限。

如果我们的owner、grouper、other对应的rwx 是 这样的:

Linux权限_第10张图片

 

 因此,可以根据对应的数字修改权限:

去掉owner、grouper、other的所有权限:

chmod 000 test.txt

保留 owner、grouperd的读写,去掉other所有权限:

chmod 660 test.txt

 

如果我们想把文件给其他用户怎么办,也就是改变拥有者owner(用chown/chgrp指令),  理论上普通用户不可以这么做:

 显示“操作不被允许”。但是我们可以sudo提权来执行:

sudo chown zhangsan test.txt

这样就能改变文件的owner,将其交给zhangsan。

同样的,所属组也可以改:

sudo chgrp zhangsan test.txt

也可以将两个命令合并,同时修改owner和grouper:

chown zhangsan:zhangsan test.txt

默认权限规定

上面提到了权限的八进制,那我们随便查看一个普通文件和一个目录:

 可以看到目录是rwx   rwx   r-x,对应八进制 775,普通文件是 rw-  rw-  r--,对应八进制664

那为什么默认不是rwx   rwx   rwx(777)呢?

这里就涉及到起始权限了,系统规定目录起始权限是777,普通文件是666,。

并且还有一个东西叫权限掩码,umask————系统会默认会配置好umask权限掩码:凡是在umask出现的权限,都必须在起始权限中去掉。

很抽象,举个例子来看:

先查看一下我的系统默认umask权限掩码:

 我的umask权限掩码是0002,这是个八进制数,第一位0表示是八进制的意思,可以不用看。

上面说 “ 凡是在umask出现的权限,都必须在起始权限中去掉。” 那么002与owner、grouper、other权限对应起来就是 000 000 010.

要去掉出现的权限,也就是010,也就是other中的第二位w,回到目录上:777去掉other的w,就变成了775,普通文件666去掉other的w就变成了664.

既然umask权限掩码是系统默认为0002的,那么也可以更改,比如我改成032,那么目录和普通文件默认权限相应也会跟着改变:

Linux权限_第11张图片

 发现确实是变了,那么 “ 凡是在umask出现的权限,都必须在起始权限中去掉”   “ 去掉 ” 又是如何去掉的呢?————实际上对umask按位取反(~umask)再 & 起始权限 就是最终权限的结果。

还有一个问题:为什么目录系统权限默认是777,普通文件权限默认是666,?

————我们进入目录,需要权限x,读取或修改目录里的内容,则需要r,w。一般目录被创建后都会进入,所以默认需要权限x。

而普通文件一般不需要进入,读写权限够了,所以默认是666 。

你可能感兴趣的:(linux,服务器)