目录
Linux下的基本用户
权限的概念
如何操作权限
默认权限规定
Linux下有两种用户:超级管理员(root)和 普通用户。
root的权限非常高,几乎可以做到任何事情,而普通用户就要受到权限的约束。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
我们也可以在两种用户之间切换:
1、普通用户切换root:
用su命令,+root密码就可以完成切换。
su - 也可以实现,不同之处在于su (root)是还处于原来路径底下,但用户切成了root。
而su - 则是重新加载到root路径底下。
2、root用户切换普通用户
root权限非常高,它切换时不需要输入普通用户的密码!
如果我们不想切换成root用户,只是想短暂获得root权限执行命令,可以用sudo指令,距离sudo最近的一条指令默认获得短暂提权。
在提权之前只需要输入你现在使用的普通用户的密码,就可以获得5~15分钟左右的root权限,不需要再次输入密码。
这是因为系统不信任此用户,所以不会给你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,所以具体是看扮演的角色系统进行划分的。
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下文件的类型和Windows下有很大不同。
Windows下以后缀名区分文件,像.txt是文本文件,.jpg是图片类型文件.......
而Linux下不以后缀名区分文件,也就是说Linux系统看来,a.txt和a.out是一样的。
我们将test.txt文件改成k.out并执行,发现没有问题,说明Linux系统确实不以后缀名区分文件。
当然,我们可以在Linux下使用后缀名,仅仅是方便我们区分。
那Linux通过什么来区分呢?————就是上面说的 ll 显示的众多属性列中第一列的字符区分。
普通文件和目录文件我们见得太多了,下面说说其他几个。
d:块设备:通常是指磁盘。
l:链接文件:类似于Windows下的快捷方式。
快捷方式删了,相应文件还在。
p:管道文件:
我们复制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 是 这样的:
因此,可以根据对应的数字修改权限:
去掉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,那么目录和普通文件默认权限相应也会跟着改变:
发现确实是变了,那么 “ 凡是在umask出现的权限,都必须在起始权限中去掉” “ 去掉 ” 又是如何去掉的呢?————实际上对umask按位取反(~umask)再 & 起始权限 就是最终权限的结果。
还有一个问题:为什么目录系统权限默认是777,普通文件权限默认是666,?
————我们进入目录,需要权限x,读取或修改目录里的内容,则需要r,w。一般目录被创建后都会进入,所以默认需要权限x。
而普通文件一般不需要进入,读写权限够了,所以默认是666 。