Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。
而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
将使用者的命令翻译给核心(kernel)处理。 同时,将核心的处理结果翻译给使用者。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
广义上:Linux发行版=Linux内核+外壳程序;
狭义上:Linux = Linux 内核;
所以说一个Linux要运行起来,需要shell程序的支持,因为它帮助我们和内核打交道,至于为什么不直接和内核打交道,也很容易理解,因为直接操纵内核代码本身就是很危险的事情;
shell中我们最常用的是bash的一个程序,这两种关系就像:聊天软件和QQ的关系,也就是说聊天软件有微信QQ等其他,而我们选择了QQ;在Linux上我们就是使用bash来解释命令的;
在我们Linux中权限就是:一件事是否允许被特定的人做;权限约束的对象是人,而我们的文件天然有:r(读),w(写),x(可执行)三个权限;那么对我人来说:就需要受到权限的约束,于此同时,权限对于我们人来说,也是一种管理,因为只有管理好才可以约束好;
我们可以理解 权限 = 人+事物的属性;而人要管理权限,也就是管理事物属性,同时权限要约束人,也就是事物属性要约束人;
对于人来说:
也就是Linux的用户类别有三种:拥有者(owner),所属组(group),其他(other);
拥有者(owner):对文件的拥有权力管理的人;
所属组(group):对文件拥有权力管理的小组;
其他(other):不对文件具有权力管理的人,也就是说不是拥有者和所属组的人就是other;
在我们的Linux文件中:我们也可以看到这些相关信息:
而对于文件的拥有者和所属组我们都是可以修改的,也就是说对于文件的管理权限的用户,我们是可以修改的;
-
表示普通文件
d
表示目录文件
c
表示字符设备文件:如我们的键盘和显示器
p
表示管道文件:用来通信的
l
表示软连接文件:也就是快捷方式
b
表示硬盘磁盘设备文件
我们就可以通过文件属性的第一个字母去判断:文件的类型了;
su - 可以普通用户切换到超级用户,第一次时候需要root密码
su - 用户名 可以从超级用户切换到普通用户;
只要切换过,之后就可以按ctrl+d切换,这样会减少开bash进程,也可以使用exit切换;
su 切换到超级用户,并且还在当前目录,假如加 - 参数那么表示,切换到root的家目录中 ~
对于一条指令没有只想权限那么我们可以加 sudo去执行该指令,表示短暂提升权限,去执行该指令;
修改权限可以一个一个的改,也可以组合的改
给文件加减权限的命令 chmod
chmod u+rwx file.txt #给文本文件file.txt的拥有者加可读可写可执行的权限
chmod g+rwx file.txt #给所属组加可读可写可执行权限
chmod o+rwx file.txt #给其他人加可读可写可执行权限
chmod u+rw,g-x,o-rwx file.txt #给u加上可读可写 给g去掉可执行 给o去掉可读可写可执行
其中这里的 u g o 分别表示拥有者 所属组 其他人
而这里的+号或者是-号,表示加权限和-权限
后面的r w x 分别表示可读 可写 可执行
有一个场景:虽然这里的拥有者的写入权限是被限制无法写入了。但是你强制写入也是没问题的,因为你本身就是拥有者,但是你却无法普通写入,只能强制的写入
我们用vim强制写入看看:
当我强制保存才可以!也成功写入了。
修改权限还有第二套方案:
即把 u g o 对应于八进制 从000 ->111; 即在八进制中 一个位就表示对应的 权限者 ;
chmod 666 file.txt # 把file.txt 文件权限修改为 u rw-;g rw-;o rw-;
chmod 000 file.txt # 把file.txt 文件权限修改为 u ---;g ---;o ---;
chmod 777 file.txt # 把file.txt 文件权限修改为 u rwx;g rwx;o rwx;
权限是显示普通用户的,对于root用户来说,任何权限都无法显示它。
chown xjh file.txt #修改file.txt拥有者为xjh
chown root file.txt #修改file.txt拥有中为root
前提:你想修改文件的拥有者,需要提升权限:在命令面前加sudo即可;
对于root用户来说,不会受权限的限制所以root用户可以随便修改文件的拥有者;
chgrp root file.txt #修改file.txt文件的所属组为root
chgrp xjh file.txt #修改file.txt文件的所属组为xjh
前提:依旧是需要root用户才可以直接操作,如果你是普通用户那么就需要短暂提升权限:使用sudo即可
但是:有个细节:就是假如这个文件本身拥有者是属于你的,并且所属组假如不属于你的,也是可以直接修改所属组的,因为很简单,文件本身拥有者就是你,那么你肯定可以改;
还有一种方式同时修改拥有者和所属组的方式
chown root:root file.txt #修改file.txt的拥有者和所属组为file.txt
有人提问other的权限如何修改?其实不需要修改,因为你不是拥有中和所属组,那么就说明你是other了;
还有要区分一个概念:创建者和拥有中不是同一个概念,创建者创建的文件是是属于他的,他同时也是拥有者,但是同时别人也可以修改拥有者的身份,那么创建者和拥有者就不一样了;
首先我们得知道,一个目录假如没有了读权限:那么表示我们就无法看到目录里面得内容了;
其次我们要记得:权限限制的是普通用户,对与root来说是不受权限限制的;
对于目录文件而言:写权限意味着我可以向目录里创建新的文件:本质就是给多叉树添加结点的操作;
问题又来了:进入目录需要什么权限呢?也就是cd
一个目录;
需要的是x权限,也就是可执行路径
所以不要误认为:进入一个目录是需要读的权限,其实是可执行权限;
有个好玩的现象:假如一个目录有读权限r:却没有可执行权限x;如果你要查看目录文件内容,只能查看到那到里面的文件名,具体信息属性是不给查看的;
其实也很好理解:目录本身就是要先可以进去,才可以查看的,但是由于权限的限制,导致了只可以看不可以进去;这就相当于去探监一样。。。只可以给你看人,不给你进去监狱看里面的具体监狱模样;
还要注意一个点:
一个目录对other没有写权限w:那么other是无法删除目录下的文件的;
一个目录对other有些权限w:那么other是可以删除目录下的文件的,也就是说这个文件拥有者即使不是你的你也可以删除;
上面删除失败原因就是该目录test 没有w权限,所以other用户xjh无法删除test目录下拥有者root的所有文件;
总结:删除一个文件,不与删除该文件的人有关,也就是说,不管你是不是拥有者,都有可能删除该文件;上面的例子就说明:普通用户xjh可以删除root用户的文件,这个不于用户有关;
相关联的是:该目录是否对other有w权限,有的话,other就可以 删改目录下的所有文件咯;
需求提出:有时候我们有个这样的场景:我们other用户想在一个特定的目录下创建文件,但是我们other用户又不可以删除改目录下其他人任何人的文件,是否有一种方式可以限制起来呢?
怎么理解这个需求:我们知道要在一个目录下创建文件,就必须又w写权限,所以说我们在一个目录下创建一个文件,只要改目录是又w权限即可;但是我们other又不想删除别人的文件,也就是,只要限制改目录下没有w权限即可;这么说要完成这种需求那么不是矛盾了吗?
其实不矛盾,我们就是希望其他人在该目录能创建文件,但是不可以删除别人的文件,这种需求确实存在,所以在Linux中,我们有一种权限的叫做粘滞位,其实就是给other用户的x权限的位置改为t权限,这个t权限和x权限唯一区别就是,有了t权限,该文件就不可以被other用户删除掉了,只能被root或者是拥有者删除该文件
修改other为权限为粘滞位:
带来的效果就是other用户无法删除改目录下的别人的文件:
粘滞位的特点:
只对目录进行设置,一般限制other人的权限;
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除
在Linux系统中:/tmp 目录就是一个有粘滞位权限的目录:该目录也就是存放所有人户的临时文件的地方,谁都有访问改目录的权限,但是对于里面的文件,只能属于文件用拥有者才可以删除(也包括root用户),所以把它设置为粘滞位权限;
我们发现在Linux中一个很有趣的现象就是:
默认创建的普通文件一般都是:664权限;
默认创建的目录文件一般都是:775权限;
为什么会是这样呢?首先我们得有个认识:
对于普通文件:起始权限都是666;
对于目录文件:起始权限就是777;
这个起始权限是非官方得说法,为什么我们创建文件默认权限不是和起始文件一样呢?
因为这是系统中有一个权限掩码得存在得原因:我们可以使用umask命令查看;
有一个公式:默认权限 = 起始权限&(~权限掩码);
所以说我们普通文件得 664 = 666 & ~002;目录文件775 = 777 & ~002;
起始权限掩码还是可以自定义的,但是这个自定义的方式只对当前用户有效,不会对其他用户生效,并且一旦退出改用户,也会失效;
umask 0333 #第一个0是八进制的意思,给系统设置默认掩码为0333,
导致结果就是创建文件,默认权限会不一样了