Linux -- 权限的理解
shell命令以及运行原理
# 和 $ 表示提示符,表示系统命令行和自己写的命令的分割线。 其中#为超级用户,即root;$为普通用户。
拓展:Linux严格意义上说是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
在操作系统内核的外部会包裹一层软件层,这个软件层我们称为外壳程序,这个外壳程序最直观的表现就是给用户打印出来命令行,然后会提醒用户输入命令。你所输入的命令本质上就是字符串,它最终会把命令交给外壳程序,这个外壳程序最终会把命令交给操作系统,让操作系统去执行;操作系统执行完会通过外壳程序把结果返回给用户,最终你就看到了命令的执行结果。综上,我们将整个命令执行过程的处理器称为命令行解释器。
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。
帮助理解:如果小王是一个闷骚且害羞的程序员,特别不擅长和女孩子打交道,小王看上了小花,但是又不好意思直接表白,小王就让家人找媒婆帮小王提亲,所有的事情小王都直接跟媒婆沟通,由媒婆转达小王的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash命令。王婆就帮小王邀请小花去约会,此时如果小花拒绝了王婆,那王婆就会原路返回到你身边,告诉你小花说跟你不合适,这样我们就完成了一次请求,这里小花就是操作系统,你就是用户,王婆就是外壳程序,小王为什么不自己去找小花呢,因为小王不擅长和女孩子打交道,让王婆帮你去打交道会更方便,这就是外壳程序的作用之一,而小花拒绝王婆并让王婆转达给你,这叫操作系统返回错误信息给用户; 第二次小王还是想让王婆帮你找小花说媒,但是这一次去王婆发现小花家里多了一个帅气的男人和小花一家人在吃饭呢,王婆连门都没进就直接原路返回了,然后告诉小王没有戏了放弃吧,这属于媒婆变相拒绝了你的请求,没有进门破坏小花一家人的氛围,属于变相的保护了小花,称为外壳程序保护操作系统内核,比如用户输入了一个不存在的命令,就会非法命令拒绝执行;后来小王依旧执拗想让王婆帮他说媒,告诉王婆必须把这个媒说成,但是小王的老爸老王私下和王婆说,他儿子有执念,哪怕给小王做做样子都成,王婆一听有道理,而且站在王婆的角度,方圆五公里内的婚嫁论娶都是我说的,帮着小王连续说媒这么多次都不成,丢脸的看似是小王家,实则是大家认为王婆的业务能力不行,既然老王都这么说了,王婆就要保证自己的招牌不倒,还要把这个事给他做了,于是王婆在boss直聘上招聘了几个实习生,王婆就把业务交给了实习生,事成了算王婆的功劳,做砸了也不影响王婆的名誉。此时王婆就采用了实习生模式,未来外壳程序在系统层面上实在进程上体现的,外壳程序是不能挂掉的,一般有新命令输入的时候,往往不是外壳程序执行的,而是创建的子进程进行执行的,子进程挂掉是不会影响外壳程序的。后面讲进程会在涉及。
为什么要存在外壳程序:
- 方便用户操作。
- 外壳程序能够保护内核。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
在linux每次登陆系统时,都会启动bash这样一个程序,这个bash本质上就是一个死循环,其作用就是不断解释、做命令分析和执行的。shell和bash的关系就是媒婆和王婆的关系,shell是所有外壳程序的统称,linux的外壳程序叫bash。在这里我们无需过多理解,记住linux的命令行是一种外壳程序、windows的图形化界面和命令行也都是一种外壳程序即可。
Linux权限
Linux中的用户
第一节课学习Linux的时候,我们已经知道Linux是一种多用户的操作系统,linux中的用户是分为超级用户(root)和普通用户的,多个用户之间的操作互不影响。类比,在我们使用的windows中,有管理员和普通用户之分。Linux中的root用户权限高,普通用户权限低,受管控。
下面我给大家举个例子:
首先我们创建一个myprocess命名的.c文件,nano打开输入代码,使用ctrl+r找到历史命令gcc生成可执行程序,运行可以看到结果。
我们执行可执行程序时需要以./开头的,可是我今天想把我自己写的程序安装到系统里,也就是说我执行我的程序时不想以./的方式,而是以命令的方式执行。那我就需要将可执行程序拷贝到/usr/bin系统目录下。
如果我们使用的是root用户,就可以直接执行。
如果我们使用的是普通用户,比如我直接使用su命令转到zy用户执行上面的操作,我们会发现我们没有权限执行该操作。 (注意这里虽然用户名改变了,但其实还是在root用户的目录下,所以目录不变)
如果我们原来是普通用户,我们想要执行该操作,那就需要su到root用户,输入root用户的密码,转换到root后就可以执行了。 (注意输入密码是不回显的,输入完回车即可)
如果我们想要退回普通用户,可以使用exit命令,也可以使用ctrl+d。所以这里转变身份并不是退出,只是在这层身份上又套了一层身份。还有一种做法是su -,但是这个操作是让我们以root身份重新登录了操作系统,目录会随之改变,而前面的操作只是更换身份,目录是不变的。
除此之外,我们还有第二种方法sudo,它的作用是用来进行短暂的指令提权。比如安装一个软件到系统中,需要使用到root权限,但其实安装了一份软件,在所有用户中都是可以使用的。提到这里,有的人可能就会有疑问了,如果可以使用sudo短暂提权,那不是人人都可以使用root的权利了?其实在root中对于普通用户是有一份类似白名单的文件,只有在白名单中的用户使用sudo,才可以进行root权限操作,其他不再白名单中的用户会在使用sudo时报错。
总结:超级->普通:su 用户名
普通->超级:su之后在输入密码。
如果你使用的普通用户在root白名单中,那么可以使用sudo进行短暂提权使用。
权限
是什么?
权限的本质是能不能做某件事。
为什么?
1、控制用户的行为,防止错误的发生。
2、对权限的理解:权限首先限制的是角色(人);权限要求目标必须具备对应的属性;
3、权限 = 角色 + 目标权限属性(读、写、执行 <- Linux下一切皆文件)
知识补充:
1、角色分为拥有者、所属组和other。其中拥有者代表的是具体的用户,而所属组表示的是这个角色属性的统称,两者并不冲突,是相互补充的!类似张法官和法官的关系。
2、为什么在系统中只记录了拥有者和所属组,没有记录other呢?答:因为other种类非常多,拥有者和所属组之外的所有类型都统称other,因此在使用时,我们只要将用户对比拥有者和所属组,两者都不成立,即属于other。
3、什么是所属组?为什么所属组会存在?
我们通过故事来理解:有一天,某大公司给小王发了一个offer,同时也给小李发了offer,进公司之后,小王被分到了A组,小李被分到了B组;在这所公司中存在赛马制度(允许不同组之间做同样的事情,谁先做的让公司内部大部分人满意,谁获得这个项目),A组和B组同时接了一个项目,那么公司就会给A组和B组分配所属组权限,因为存在这个所属组,A组内部的小王(拥有者)在公开代码时,可以只向A组(所属组)内部的人公开,如果不存在所属组,那B组(other)的人同样也能看到小王的代码,为了杜绝这种事发生,在Linux诞生之初就存在了所属组的方式。
所属组的存在是为了更精细化的权限管理,首选更精细化的身份角色。
知识补充:
综合上面讲述的权限和所属组解释,我们可以了解到一个文件对应的目标属性有读、写、执行(rwx),访问文件的用户类型分为拥有者、所属组、other。再次回顾我们在Linux课程的开始讲的文件属性,开头第一个数据表示的是文件类型,其实第一个字符表示的是文件的类型(如 - 是普通文件, d 是目录等等),后面的九个字符我们三个三个为一组,分别表示的是拥有者的读、写、执行权限;所属组的读、写、执行权限和other的读、写、执行权限。允许读则r,否则-;允许写则w,否则-;允许执行则x,否则-。现在是不是更加清晰的了解了文件属性呢。
怎么改?
更改权限
1、修改拥有者权限使用的指令是chmod(change mode)。使用u + rwx,可以打开拥有者(User)的rwx权限,使用u - rwx,可以关闭拥有者的rwx权限。使用g + rwx,可以打开所属组(Group)的rwx权限,使用g - rwx,可以关闭所属组的rwx权限。使用o + rwx,可以打开other的rwx权限,使用o - rwx,可以关闭other的rwx权限。下图以拥有者为例进行演示:
2、如果我们想一次性给多个类型的用户加减权限,只需中间逗号隔开即可。如果我们想给三个类型的用户同时加减权限,需要使用a + rwx / a - rwx (all)即可。
有了初步了解之后,我们进入重点部分:
1、我们能改任何人的权限吗?
答案是不能,用户只能更改自己的文件权限。如果你非要改,就要把用户变为root或者sudo提升用户权限进行修改。
2、没有权限会发生什么?
系统会拒绝我们访问。下图访问文件拥有写权限,没有读权限,所以可以进行echo重定向写入,但是不能cat读取打印。
3、在确定权限信息的时候,系统会先确定用户是谁?拥有者、所属组还是other?
在centos系统下,用户角色确定只会确定一次,顺序是拥有者、所属组、other,即当确定了用户是拥有者,那么就只看文件的拥有者权限,不会再看所属组和other对应的权限了。当用户既是拥有者又是所属组时,只会查看拥有者权限,即便你所属组拥有权限也会被拒绝。如果确定了用户并非拥有者,那么就会继续向后核对用户身份,如果是所属组,则只查看所属组权限,否则继续向后……
4、root用户的权限?
不受限制约束!所有的限制都是约束普通用户的。
5、如何理解可执行权限?
可执行权限不等于文件可以执行!你给文件赋予了可执行的权利,但是文件能不能执行还是要看文件本身是否是一个可执行文件,有权限没能力照样不可执行。如果没有可执行权限,即便是可执行文件,也不能执行。
更改人
更改拥有者使用的指令是chown(change owner),更改所属组使用的指令是chgrp(change group)。不属于拥有者和所属组的用户均为other,所以无需更改。
1、系统默认不允许把文件转给其他用户
这其实是合理的,因为前面更改权限只是对自己的文件权限属性进行修改,不会影响其他人,但是更改文件的拥有者、所属组等会影响其他用户,这是系统默认不允许的!
如果想要更改给其他人,必须有高权限,也就是说强制更改,这里可以使用su(切换为root)或者 sudo进行指令提权。我们将cmd可执行文件的拥有者改为zpw,使用sudo进行提权后就成功了。
如果我们想一次性更改文件的拥有者和所属组,只需使用chown 拥有者:所属组 文件名 :
未来想要更改文件的拥有者和所属组只需使用chown即可,chgrp会用的比较少。
重谈修改文件属性
我们已经了解了想要修改文件权限使用的是chmod,在文件的类型列是以rwx/---显示的,那有没有更简洁的方法呢?答案是有的,因为权限的属性只有有和无两种形式,那么我们就可以将其转化为1/0表示,单个用户的权限表示为3位,例如110,表示为rw-,那么我们就可以将其转换为8进制来修改。下图中666表示为2进制就是110110110,所以所有用户的rw权限都会开放,x权限都会关闭。如果改为777呢,大家可以自己去验证一下,但还是跟推荐第一种做法。
目录权限
1、如果想进入一个目录,需要什么权限?
答案是x,可执行权限!
2、rwx对目录分别意味着什么?
如果没有r权限,就无法查看目录中的内容。
如果没有w权限,就无法在目录中新建/删除/修改文件。
如果没有x权限,就无法cd进入目录。
超级用户(root)不受权限约束!!!但是有一种情况下,root也不可以使用,就是文件正在被使用中,文件会受到保护,root也无法插手。
3、理解Linux多用户之间怎么互相"隔离"的?
家目录中的所有用户都只开放自己的读写执行权限,所属组和other都是关闭的,因此任何用户都无法进入其他用户的家目录!
缺省权限
对于普通文件,默认起始权限 666,即rw-rw-rw-,默认不带可执行。
对于目录文件,默认起始权限 777,即rwxrwxrwx,默认携带x,全开放。
但是因为系统存在一个叫权限掩码的概念,默认缺省2(不一定相同,按你们的服务器为准),所以我们新创建的文件的最终起始权限会与默认起始权限不一致。(本质是与0002的二进制形式进行按位取反后的111 111 101进行逻辑与操作,即最终起始权限 = 默认起始权限 & (-umask),注意:这里并不可以做减法!!)
那么umask存在的意义是什么呢?希望凡是在umask中出现的权限,都不应该在最终起始权限中出现,因为其实默认起始权限是操作系统自主决定的,无法在创建前进行修改,所以umask是修改最终起始权限的一种措施。umask也是可以修改的,特殊情况下,配置umask,可以控制文件的最终起始权限。而umask在系统的配置文件中是默认写好的,我们修改后,下一次打开时umask依然默认为0002。
粘滞位
一个文件是否被删除,与文件本身无关!与文件所处的目录w权限有关!如果两个用户想要进行文件级别的写作呢?该文件不能放在任何一个私人账号里,但是可以放在共享类文件(拥有者一般是root)中,为了不让非文件的拥有者删除文件,Linux设计了一个权限标记位:t(粘滞位),使用方式是chmod +t 共享目录名,成功后打印指令ll,结果如下:
我们再想要删除共享目中的非拥有者文件就做不到了,但删除自己的文件是可以的。
这里要注意的是粘滞位的特性:只能给共享的目录添加粘滞位。