首先我们要知道权限是什么?拿生活中常见的例子来说明,比如腾讯视频的VIP,有很多的电视剧或者电影,只有VIP用户才能观看,而非VIP用户是无法观看的。
换言之,对于那些需要VIP才能看的电视剧和电影,VIP用户就有观看它的权力,而非VIP用户就没有。
所以我们说,权限就是限制某些人去做某些事情。
- 对于Linux下,权限的意义也是一样,
- Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以在linux系统下做任何事情,不受限制
- 普通用户:在linux下做有限的事情。
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
root用户就相当于是VIP用户,只是root用户在Linux中的权限更大,可以称为上帝,因为什么都可以干。普通用户就相当于是非VIP用户,它在Linux中同样受到很多限制。
这是本喵Linux系统下的root用户输入命令的界面,命令行提示符是‘#’。
这是普通用户的输入命令界面,该用户名为‘wxf’,命令行提示符是‘$’。
上面我们说到,权限是在限制某些人做某些事情,在Linux中,限制的人就是普通用户和root用户,而做的事情呢一般就是对文件进行操作,操作文件操作的是文件的属性。
所以说,在Linu下,权限=用户+文件属性
在Linux中,root用户和普通用户之前是可以随意切换的,此时需要用到指令su。
- 命令:su [用户名]
- 功能:切换用户。
- 例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 suroot(root可以省略),此时系统会提示输入root用户的口令。
上图中,输入指令su后,再输入root用户的密码,此时就从普通用户wxf切换到了root用户。
上图中,输入指令su wxf后,不用输入密码,此时就从root用户切换到了普通用户wxf,从root用户可以切换到任意一个普通用户,而且不需要输入普通用户的密码,从这里也可以看出,root用户的权限是多么的大。
使用指令su会从普通用户切换到root用户,但是如果我就是不像切换用户,但是像做root用户才有权利做的事情呢?
此时可以用sudo命令来进行短暂的提权,就是给普通用户短暂的赋予root用户的权力。
- 用法:sudo 指令
- 功能:给普通用户进行短暂的提权,从而进行只有root用户才能进行的操作。
如上图中,当进行一个普通用户没有权限的操作时,可以在这条指令的前面加上sudo,此时就会给普通用户短暂的提权,赋予他root用户有的权力,从而成功执行这条语句。在执行这条指令的时候,需要输入普通用的密码。
你是不是觉得,如果可以进行短暂提权的话,那么普通用户岂不是也可以像root用户那样为所欲为了?只要在没有权限的时候提权就行了啊。
是这样的,但是有一个前提,就是这个普通用户必须在白名单里,因为他不会进行非法的操作,所以才会把他加入白名单,也就是系统是因为他不会非常操作才信任的他。
将用户加到白名单中,需要使用到VIM,怎么加入等后面讲解VIM的时候再讲解。
我们知道权限就是限制某些人做某些事情,事实上是限制的这个人吗?比如,你叫张三,是某某大学的学生,你之所以能够进入该大学上课,学习,生活,是因为你叫张三吗?并不是,是因为你的角色,你的角色是这个学校的学生。
当然,人和角色是共存的,只有先有了这个人才会有他所扮演的角色。
同样的,Linux中给普通用户赋予了三个角色,分别是:
- 文件的所有者(owner):用户一个文件的用户
- 文件的所属组(gouper):一个文件所在组之内的用户
- 其他人(other):和一个文件没有关系的人
这其中,所有者和其他人都很容易理解,但是所属组怎么理解呢?
比如有俩个团队,一个是A,另一个是B,在这俩个团队中都有很多的人,其中张三是团队A的,李四是团队B的,这俩个团队在竞争开发一个项目,先开发出的团队加薪留下。这个团队的拥有者,也就是领导,为了方便安排任务,需要随时能够有权限看到组内成员写的代码,包括组内成员也可以互相参考,此时张三就需要将它的代码授权,但是不能让团队B看到,所以就给他所在的组授权,也就是所属组。
弄清楚Linux下的用户以后,权限还涉及到另一个方面,就是文件的属性。
文件属性有三个:
- 读:用r表示
- 写:用w表示
- 执行:用x表示
所以说,Linux下的权限也可以理解为,用户所扮演的角色是否有对文件的三个属性进行操作的权力。
创建俩个文件,一个是目录file,另一个是普通文件test.c。
我们知道,在Windows下,是通过文件的后缀,就像上面test文件的后缀.c来区分文件的类型的,但是在Linux下并不是这样,文件后面可以加任意的后缀,因为Linux系统对文件类型的判定并不是根据它的后缀,后缀只是为了让用户方便区分。
那Linux系统是怎么区分文件类型的呢?我们看到,Linux下的每文件在文件名之前都会有很长的一段字符,这里面就包含着文件的类型。
上图中是命令行指令之前那些字符所代表的意义。下面本喵来进行解释。
刚刚创建的俩个文件,在使用ll指令查看他们的文件属性时,文件名的前面会有很长的字符串,最前面的一个字符,表示的是文件类型,如图中的红色框。
- d:文件夹
- -:普通文件
- l:软链接(类似Windows的快捷方式)
- b:块设备文件(例如硬盘、光驱等)
- p:管道文件
- c:字符设备文件(例如屏幕等串口设备)
- s:套接口文件
其中,文件夹和普通文件是我们最常见的文件类型,对应着上图中,file那一行的第一个字符的是d,表示file是一个文件夹,test.c那一行的第一个字符是‘-’,表示test.c是一个普通文件。
再比如:
上图中的tty文件,这一行的第一个字符就是c,红色框所示,表示这是一个字符设备文件。
这些文件类型在后面本喵都会讲解到,这里我们只需要知道,文件夹和普通文件的第一个字符是什么就可以。
- 语法:file [选项] 文件或目录…
- 功能说明:辨识文件类型。
- 常用选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试去解读压缩文件的内容
面对一个文件,我们也可以使用file指令来直接查看它的文件类型:
可以看到,使用file指令后,系统就会告诉我们这是一个什么文件,上图中,dircetory表示这是一个目录,empty表示这是一个普通文件。
文件名前面的字符不仅能表示文件类型,还能表示它的访问权限。上图中的绿色框一共框住了10个字符,除了第一个字符还剩下9个字符,这9个字符就是用来表示访问权限的。
为什么剩下的是9个呢?上面我们说过,每个用户都有三个角色,所有者(owner),所属组(grouper),其他(other),所以这9个字符,给每个角色分3个,正好分配完。
如上图中,最前面的3个字符是分配给owner的,中间的3个是分配给grouper的,后面的3个是分配给other的。
每个角色的三个字符所代表的意思都是一样的,表示着不同角色下所拥有的权限。这三个字符表示的意思是什么呢?
我们知道,文件的属性有三种,r,w,x,所以这里的三个字符表示的就是不同角色下对文件进行读,写,执行的权限。
- 第一个位置表示读:可读就是r,不可读就是‘-’
- 第二个位置表示写:可写就是w,不可写就是‘-’
- 第三个位置表示执行:可执行就是x,不可执行就是‘-’
以上图中的俩个例子来说明:
- file:文件file是一个目录,它的所有者可以对文件进行读,写,执行操作,它的所属组可以对它进行读,写,执行操作,其他人可以对它进行读和执行操作。
- 文件test.c是一个普通文件,它的所有者可以对它进行读和写操作,它的所属组可以对它进行读和写操作,其他人只能对它进行读。
这样一来,文件的类型和访问权限我们就都描述清楚了,描述一个文件的权限时,必须从用户的角色以及文件的属性俩个角度出发。
现在文件所在那一行的前10个字符我们已经知道是什么意思了,那么剩下的是什么呢?
- 连接数:上图中的红色框,表示该文件的连接数,详细内容本喵以后再讲解
- 拥有者:绿色框中是该文件的拥有者,这里是用户wxf拥有这个文件
- 所属组:深蓝色框中是该文件的所属组,这里该文件属于用户wxf这个组
- 文件大小:橘色框中是文件的大小,单位是字节
- 创建或更改时间:浅蓝色框中是该文件的创建时间,或者是修改后的时间
此时,一个文件名前面的所有字符表示的意思我们就都清楚了,可以看到,这些字符是在描述这个文件的访问权限和属性。
在知道了权限是什么以后,我们就可以使用权限了,也就是对权限进行操作,在Linux下我们通过指令来设置文件的访问权限。
- 用法:chmod [参数] 权限值 文件名
- 功能:设置文件的访问权限
- 常用选项:
R -> 递归修改目录文件的权限。
说明:只有文件的拥有者和root才可以改变文件的权限。
chmod命令权限值的格式:
用户符号 | 意义 |
---|---|
u | 拥有者 |
g | 拥有者所属组 |
o | 其它用户 |
a | 所有用户 |
上表中是用户符号的。
符号 | 意义 |
---|---|
+ | 向权限范围增加权限代号所表示的权限 |
- | 向权限范围取消权限代号所表示的权限 |
= | 向权限范围赋予权限代号所表示的权限 |
上表是设置权限是+,-,=的意义
权限字符 | 意义 |
---|---|
r | 只读 |
w | 只写 |
x | 只执行 |
wrx | 读写可执行 |
下面本喵就给大家演示一下如何使用:
如果还是要进行读会发生什么呢?
此时对这俩个文件进行读操作时就失败了,权限被拒绝。
不仅可以删除一个权限,还可以删除多个权限:
此时就无法对这俩个文件进行写和执行操作了。
还可以同时将所有者,所属组,其他人的全部访问权限都取消:
当然我们也可以让三个角色对这俩个文件都能进行读,写,执行操作:
这些权限的设置都是针对普通用户的,对于root用户是限制不住的。
上面例子中又一次体现出了root用户是可以在Linux中为所欲为的。
在前面本喵讲过,普通用户的每个角色对一个文件的访问权限都有3个字符,修改权限时,除了使用上诉方法外,还可以将将这3个字符写成8进制数,一个8进制数表示一个角色的访问权限,如:
上图中,每个角色下的三个字符中:
只读被允许,也就是r,该位写1,不允许时,也就是‘-’,该位写0。按照这个逻辑将三个字符写成一个8进制数。
- file目录对普通用户的访问权限写成八进制以后是666.
- test.c普通文件对普通用户的访问权限写成八进制以后是776.
我们也可以通过这种方式修改文件的权限,如:
这里就是使用的3个八进制数来修改文件权限的。
再尝试一个,现在将文件对三个角色的写访问权限都开放:
因为指令使用的3个八进制数是444,写成二进制后是100 100 100,代表着的权限是r-- r-- r–,所以就全部修改位仅读。
修改权限的操作只有root用户和文件的所有者才能修改,其他普通用户是无法修改权限的。
- 格式:chown [参数] 用户名 文件名
- 功能:修改文件的拥有者
- 常用选项:
-R:递归将目录及目录下的全部文件修改拥有者
我们之前所有的例子中,文件的拥有者都是用户wxf,那么能不能修改文件的拥有者呢?答案是可以的,这就需要用到指令chown来修改文件的拥有者。
当前本喵使用的机器,存在着多个用户,上面的演示都是用的普通用户wxf。
这是因为,修改文件的拥有者只能由root用户来做,普通用户是没有权限的。
使用root用户执行红色框中的指令后,俩个文件的拥有者都从普通用户root变成了普通用户yx,如上图中的绿色框。
此时这俩个文件的访问权限就只能由普通用户yx来修改,或者是root用户。
如上图,普通用户wxf想要修改文件的访问权限是不被允许的,因为此时文件的拥有者是普通用户yx,而用户wxf是文件的所属组,只能操作,不能修改权限。
- 格式:chgrp [参数] 用户组名 文件名
- 功能:修改文件或目录的所属组
- 常用选项:
-R 递归修改文件或目录的所属组
这俩个文件的所属组都是用户wxf,和拥有者一样,所属组也是可以改变的,这需要用到指令chgrp。
切记,改变所属组和改变拥有者一样,必须使用root用户,因为只有root用户才有这么大的权限。
此时,原本属于普通用户wxf的俩个文件就完全属于普通用户yx了,而且是没有商量的余地,root用户直接改变他们的所属关系,又一次证明了root用户的为所欲为。
文件的拥有者,所属组都有改变的指令,那么有没有指令来改变文件的其他人呢?答案是没有的,因为改变了文件的拥有者和所属组,其他人的关系也就改变了,就像上面例子中,将文本拥有者和所属组都是我普通用户wxf的文件改成拥有者和所属组都是普通用户yx,那么此时用户wxf就成了other了。
- 格式:umask 权限值
- 功能:查看或修改文件掩码
- 说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。
- 常用选项:无
一个文件在被创建的时候会有默认的访问权限,也就是那个9个字符,那么默认的访问权限是什么呢?为什么是这个呢?
这里用普通用户创建了一个目录dir和一个普通文件txt.c
这是为什么呢?
- 对于目录文件,系统在创建时给的初始权限是777
- 对于普通文件,系统在创建时给的初始权限是666
那为什么现在我们看到的权限分别是775和664呢?
这是因为存在权限掩码,也就是umask。
仅输入umask我们就能看到umak的值,如上方图中,此时的umask的值是0002,
- 第一个0不用管,只需要看后面的三位,可以认为第一个0是为了表示这是一个八进制数。
- 此时的权限掩码是002.
- 八进制002对于的权限就是— — -w-,也就是只有文件对其他人的写权限
在创建文件的时候,文件的权限 = 文件的起始权限 - 权限掩码(umask).
所以,目录文件的起始权限777去掉权限掩码,也就相当于777-002=005,普通文件的起始权限666去掉权限掩码,也就相当于666-002=664.
此时我们就清楚为什么文件在创建后它的起始权限为什么是那个样子了。
准确的来讲,文件创建后的权限并不是等于文件的起始权限减去默认掩码,比如:
在创建文件的时候,文件的权限 = 文件的起始权限 & (~(权限掩码) )。
也就是,文件的权限等于起始权限和权限掩码按位取反后再按位与。
再看上面的例子,
- 普通文件txt.c系统给的起始权限是666,转换成八进制就是110110110
- 此时系统的权限掩码是001,转换成八进制就是000000001
- 将权限掩码按位取反后是:111111110
- 再与文件的起始权限按位与后是:110110110,并没有改变。
我们可以这样认为,权限掩码中出现的权限,都要在起始权限中去掉,并不是减。上面例子中,权限掩码中出现的权限是x,由于起始权限中就没有x,所以不需要去掉,所以文件最后的权限就是起始权限。
在我们使用的Linux中有一个命令行解释器,这个东西就是本喵在输入各种指令的那个界面,具体表现为我们可以看到的命令行提示符,以及可以输入指令并且执行。
而命令行解释器也被叫做shell,也就是外壳程序。
- 里面的那个紫色的圆圈是Linux内核
- 外面的那个红色的外围全就是shell
- 这二者统称为Linux系统
可以看到,shell就是包裹在Linux内核外面的一个壳子。
那么shell到底起什么作用呢?
shell是人和Linux内核交流的一个中介:
- 人不善于和Linux内核打交道,如果我们直接对Linux内核操作会很繁琐,很困难
- 所以我们写各种指令交给shell,shell将我们的指令进行解释翻译润色后再交给Linux内核
- Linux内核按照shell的指示来做出对应的反应。
如上图,我们输入一个错误的指令,然后系统返回一个指令没有找到,这就是shell做出的回应,包括我们写的指令也是相当于直接写到shell上。
- shell会自行判断用户的指令是否正确,如果正确就会进行处理,然后交给Linux内核去执行
- 如果指令不合法,shell就会直接反馈给用户指令或者操作不合法,而且也不会将错误的指令给Linux,在shell这里就截断了。
所以说,shell的存在的意义不仅让我们和Linux内核的交流更加方便,而且对Linux也起一定的保护作用。
Windows系统的操作界面也是一个shell,只是将它图形化了,击桌面上的各种图标就相当于在Linux上输入命令行,然后将点击的信息经过处理后交给Windows内核去处理。
shell是一种统称,所有的系统都会有shell,只是shell的具体程序不一样,像Windows的shell就是图形化的,而大多数Linux的shell的程序都是使用的bash,这是shell程序的具体名字。
以上就是我们第一次对shell进行的感性认识,再后面还会对shell有更深一步的认识。
权限存在的意义:
结合我们前面讲的权限问题,为什么要存在权限,它的作用是什么?
- 当我们进行一个没有相应权限或者错误的操作时,shell就会拦截并且做出相应的反馈,
- 此时shell认为这个操作是对Linux有害的,是不合适的,如果没有shell,指令就会直接下达到Linux内核,此时Linux内核就会执行有害的操作,可能会造成不好的后果。
- 当我们进行有权限操作时,shell并不会拦截,而且会进行解释润色等操作,让Linux能够更好的理解该操作的意义,做出完全符号预期的反应。
所以我们说,权限的存在是便于我们的系统进行安全管理。
权限也必须借助shell才能够体现出来。
在Windows上,我们点击一个文件夹进入的时候,这个操作对应着文件的什么属性?是读还是写亦或者是执行?
下面我们来看看Linux上使用指令cd进入一个目录时,这个操作对应着目录的什么属性?
- 创建一个文件,如上图第一个红色框
- 此时这个文件的访问权限是rwx rwx r-x,写成八进制就是775
- 此时的用户是普通用户wxf,是这个文件的拥有者和所属组
- 去掉owner的r权限,此时文件的访问权限是-wx rwx r-x
- 使用指令cd进入该文件,是可以成功进去的
- 所以进入文件操作的不是文件的读属性
- 再去掉owner的w权限,此时文件的访问权限是–x rwx r-x
- 使用指令cd进入该文件,是可以成功进去的
- 所以进入文件操作的也不是文件的写属性
- 再去掉owner的x权限,此时文件的访问权限是— rwx r-x
- 使用指令cd进入该文件,shell程序bash回应我们,权限被拒绝
- 说明进入文件操作的是文件的执行属性
没想到吧,进入文件操作的是文件的执行属性而不是读属性。
在讲解粘滞位之前,本喵必须先来铺垫一些知识。
在Linux操作系统中,有很多的文件,有句话叫Linux下,一切皆文件。
本喵前面一直都在讲文件的权限,我们知道,文件或者目录只有特定的人才能进行特定的操作,但是有没有这样一个文件?这个文件中,一个Linux系统中的所有用户都可以对这个文件进行操作?答案是有的。
在Linux系统中,root用户创建了一tmp文件,在这个文件中,该系统中的所有用户都可以进行操作,也可以进行相互的交流。
在Linux的根目录下存在一个tmp文件,如上图中的红色框,这个文件就是一个公共文件,所有用户都可以在这个文件中进行操作。
这个文件的拥有者和所属组都是root,而且对拥有者和所属者的操作权限是满的,毕竟是root用户嘛,可以理解。但是对其他人的权限就是rwt了,这里的rw我们知道是读权限和写权限,但是t是什么呢?t其实就是粘滞位。
现在本喵在根目录下创建一个公共文件,如上图中的红色框。
将文件的权限全部打开,如上图中的红色框。
以普通用户wxf的身份在本喵创建的公共文件中创建三个文件,如上图中的绿色框。
再以普通用户zbj的身份在这个公共目录中创建三个文件,如上图中的绿色框。
在公共目的中的文件,因为普通文件wxf1.txt对其他人的权限是允许读写的,所以在上图中,用户zbj可以查看文件wxf1.txt中的内容,结果如绿色框中所示。
此时用户wxf觉得,既然zbj可以看我的文件,那么我就可以和他交流一下,就想向zbj的文件zbj1.txt中写一些内容,结果shell反馈操作被拒绝,也就是说wxf没有权限向zbj1.txt中写内容。
此时用户wxf有点不爽,居然不让我写东西,那我给你删了,于是就将属于用户zbj的文件zbj1.txt删除了,如上图。
当用户zbj发现自己的文件本删了,气不过,就把用户wxf的文件都给他删了,如上图中的绿色框。
此时,恶心互删事件就发生了。
但是此时有个疑问,用户可以对自己的文件设置权限,不让其他人进行操作,但是其他人可以删除我的文件,这个怎么理解?
前面本喵讲过,进入目录的操作是属于操作属性的,同时,删除也是目录的操作属性。
- 由于此时的公共目录是允许所有用户进行操作的,所以所有用户都可以对目录中的普通文件进行删除。
- 也就是说,普通文件能不能被删除,决定权不在普通文件,而在于它所属的目录。
为了避免用户直接在公共目录中互删文件,所以对这个公共文件加一个粘滞位。
- 用法:chmod +t 目录名
使用红色框中的语句给共有文件加一个粘滞位,此时共有文件对其他人的访问权限就有了一个粘滞位,如上图中的绿色小框。
为什么粘滞位要加到其他人权限上呢?因为这个共有文件的拥有者和所属组是root用户,其他全部普通用户都是其他人,限制的就是普通用户之间的互相删除。
当用户wxf发现自己的文件都被删除了,就要去删除用户zbj的文件,但是发现此时删除不了了,因为这个公共目录加上了粘滞位。
注意:
权限是非常重要的,只有搞明白了权限,才能进行正确的访问和操作,只有设置对了权限,才能保证文件的安全性和可用性。