目录
在解释权限问题之前,我想先对指令的本质和命令行解释器的作用进行一下简单的介绍。
前言
指令的本质
在命令行中输入指令的本质就是运行一段已经编译好的程序或脚本,这些脚本通常都存放在/usr/bin路径下的;
使用 which指令 可以找到具体指令存放的位置。
以下是Linux中根目录下的默认系统文件;
Linux下的命令行解释器有必要吗?
在进行指令的输入时,所有的指令都是操作系统在进行反应的,那为什么需要通过命令行间接的与操作系统进行交互,不能直接与操作系统进行交流吗???
以下从两方面进行解释:
1)操作系统使用起来难度大,只有极少数像内核开发工程师,系统架构师才会去学习如何构建操作系统,作为一名普通工程师来说学习如何与操作系统进行交互是费力不讨好的;
2)操作系统是不信任用户的,因为用户可能存在着一些危险行为的风险,而命令行可以帮助操作系统过滤一些恶意行为,比如:路径过滤,用户无法访问到其无权限的文件进行修改....
通过以上两个原因就能够总结出命令行解释器的作用:
1)将用户的请求翻译给操作系统,将操作系统处理的结果翻译给用户;
2)保护操作系统,对用户的非法请求进行拦截。
常见的命令行解释器:
1)命令行:shell(命令行解释器的总称),sh,bash;
2)图形化界面。
Linux下的权限
Linux下的用户
Linux下只用两种用户:root超级管理员,普通用户;这也就意味着至少两种权限。
root:超级用户,基本不受权限约束;
普通用户:收到权限约束,但是如果被root添加到白名单中可以暂时使用root权限。
如果你发现有些指令无法执行,可能是权限的问题!!!
如何将普通用户添加到白名单:
先找到白名单sudoers的地址:进入/ect目录,打开sudoers文本
在第100多行找到该位置;
将普通成员用以下格式添加到文本中即可。
进行保存,如果保存失败使用w! 进行强制保存。
此时就完成了将普通用户添加到白名单中;
通过sudo + 指令就可以实现对指令的暂时提权。
Linux下的权限
在了解具体权限之前,有两个很容易误解的概念,在此处进行以下解释;
1)权限认证的是身份,一个用户的身份和处境决定了其具有那些可行使的权限,像普通用户通过加入白名单其也可以行使更高的权限;
2)权限与事物的属性有关,像键盘其本身就没有输出信息的作用,所以不能任何身份都不会有该权限。
Linux下一切皆文件,所以权限最终会作用到文件上面。提一嘴Linux下区分文件的方式与Windows是不一样的,Windows是通过文件后缀来判断文件类型的,比如.exe可执行程序,.c C语言文本...但是Linux下文件的类型在创建的时候就决定了(创建文件时不同的指令对应不同的文件,如touch + 普通文件,mkdir + 目录...),Linux操作系统并不会根据文件后缀来区分文件类型,对于Linux来说文件后缀没有用,但是对于一些Linux内安装的软件可能有大用,如gcc,g++都要通过文件后缀来看时候可以编译文件。
文件的信息
文件=文件内容+文件属性,文件内容不同说就是向文件中写入的数据;关于文件属性有文件大小,文件的拥有者,文件权限......
通过 ll指令 可以看到当前目录下文件的文件属性详细信息。
对于文件来说不同用户一共有三种身份:
1)拥有者:文件的所属者,默认是文件创建者;
2)所属组:在进行分工合作的时候,一个目录中的文件由多个人共同维护,这些一起管理该目录的人可以理解为所属组,默认也是文件创作者;
3)其他人:除去拥有者和所属组后的其他人。
各文件权限
Linux下文件的权限有三种:可读,可写,可执行,对应简写为r,w,x;对于一个文件共有三种身份,那么文件属性内也应该存储了不同身份拥有的权限,上面在用 ll 显示文件的属性时,最前面一串字符就是各身份对应的文件权限。
在看文件权限的时候是三三为一组看,前三个表示拥有者的权限,中间三个是所属组的权限,最后三个是other其他人的权限,用字符代表是否有该权限,- 表示没有该权限。其权限顺序是固定的:可读,可写,可执行。
当一个用户的身份出现重叠怎么办???看哪一个权限
看第一个满足的身份,如既是文件拥有者又是所属组,那么当操作系统判断其实拥有者后就不会继续向后看其他身份了。
关于可读,可写,可执行要如何进行理解???
所有文件都是这三个权限,我们日常中主要接触的是一些普通文件和目录,对于普通文件可读,可写,可执行是很明确的;但是对于目录,什么叫做可读,可写,可执行???
普通文件的可读可写可执行:
可读:用户能否对文件内容进行读取;
可写:用户能否对文件内容进行修改;
可执行:用户能否执行可执行文件;
目录的可读可写可执行:
可读:用户能否看到目录下的文件内容;
可写:用户能否在目录下创建,删除,修改文件;
可执行:第一次听说目录可执行,目录是否可执行决定了用户能否进入目录里面。
可读就说明要进入目录里去看目录中有哪些内容,当一个用户具有可读权限,但是没有可执行权限时会出现什么情况呢???
根据以上指令描述可以看出,当具有可读但是没有可执行的时候,用户不能进入到目录中,但是还是可以看到目录中的文件信息。
在定义文件权限的时候,目录决定了目录内部的内容是否可以被修改,也就是说一个文件能否被删除取决于目录中的w权限,而不是文件本身权限,那就有个问题:当一个目录下有两个人(假设是A和B)在进行合作,A现在创建了一个文件自己写,不希望B看到,所以将该文件others的权限全部禁掉,此时B确实无法看到文件的内容,但是B却能删除该文件???是这样的吗,这合理吗???
根据以上代码可以看到:确实没有任何权限,但是还是将文件给删除了。这就很不合理了,我创建的文件,不让你读,写,但是你却能将其删除。。。
为了解决这一问题Linux引入了粘滞位,粘滞位是一种特殊的x权限:其用t来表示。
粘滞位使得当前目录下文件的删除必须由拥有者或所属组来进行。这样防止了other对文件的删除。
修改文件权限
一个文件的权限只有拥有者和root可以进行修改。
chmod [参数] 权限 +文件名:对文件的权限进行修改
对具体身份的权限进行修改:chmod u-w +文件: u-w指的是删除u(ser)拥有者的w写权限,还有u+w添加拥有者的w写权限;使用u代表user拥有者,g代表group所属组,o代表other其他人;r代表读权限,w代表写权限,x代表可执行权限。
对于三种权限可以使用二进制来表示,1代表有,0代表没有,所以111就可以表示一个身份拥有rwx权限;三种权限就可以使用一个八进制数字来表示。
使用八进制权限修改:chmod 777 +文件:将3个身份的权限都修改为777,7对应的二进制是111就是满权限。
文件权限可以进行修改,那么文件的拥有者和所属组也可以进行修改,但是只有root能进行修改。
chown + 用户 +文件:对文件的拥有者进行修改。
chgrp + 组名 + 文件:对文件所属组进行修改。
拓展
在创建文件的时候,为什么目录和普通文件创建后权限默认是怎样的???
Linux下有一个权限掩码的概念,Linux设定最终权限(我们看到的权限)== 初始权限 - 权限掩码中出现的权限;相当于权限在显示之前要先进行过滤,而这个漏斗就是权限掩码umask;
实现的方式也能通过一个式子表示:最终权限 = 起始权限 & (~umask);
umask默认是002;后面三个八进制表示对用身份过滤掉的权限。
这也就解释了为什么目录和普通文件显示的权限不一样:目录的初始权限是777经过“过滤”后变成了775,普通文件起始权限是666经过“过滤”后变成了664。