作者的一个大Mimeow 1201专栏《Linux学习》座右铭:你只要努力工作,其余的交给时间图

Linux权限的概念Linxu权限Linxu权限管理文件类型文件指令访问权限Linxu权限操作chmod指令chown指令chgrp指令umask指令Linux shell目录权限粘滞位汇总

Linxu许可的概念

首先,我们需要知道权限是什么。拿生活中常见的例子来说明比如腾讯视频里有很多电视剧或者电影。只有VIP用户可以观看,但不是VIP用户可以观看。

换句话说,对于需要VIP的电视剧和电影,VIP用户有权利看,VIP用户没有。

所以我们说权威,就是限制某些人做某些事。

Linux下的权限也是如此。Linux下有两种用户:超级用户root和普通用户。超级用户可以不受限制地在linux下做任何事情。普通用户在linux下能做的事情有限。超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。root用户相当于VIP用户,但是root用户在Linux中拥有更多的权限,可以被称为上帝,因为他可以做任何事情。普通用户相当于非VIP用户,在Linux中也受到很多限制。

这是root用户在这个喵Linux系统下输入命令的界面。命令行提示符是“#”。

这是普通用户的输入命令界面。用户名为“wXF”,命令提示符为“$”。

当我们谈论权限时,我们限制一些人做某些事情。在Linux中,被限制的人是普通用户和做事情的root用户。一般都是操作文件,文件操作就是文件的属性。

因此,据说Linu下的权限用户文件属性

在Linux中,以前root用户和普通用户可以随意切换。在这个时候,需要苏的命令。

命令su [username]函数切换用户。例如,要从root用户切换到普通用户,请使用su用户。要从普通用户切换到根用户,请省略surootroot。此时,系统会提示输入root用户的密码。

在上图中,输入命令su,然后输入root用户的密码,然后从普通用户wxf切换到root用户。

在上图中,输入命令su wxf后,可以从root切换到普通用户wxf。不需要输入普通用户的密码就可以从root切换到任何普通用户。从这里也可以看出root的权限有多大。

使用该命令苏将从普通用户切换到root用户,但如果我只是不喜欢切换用户,而是喜欢做root用户,我有权利做吗?这时候我就可以用sudo命令进行短期的权力提升,也就是短时间内给普通用户root用户的权力。

Usage sudo命令函数赋予普通用户执行只有root用户才能执行的操作的短暂权限。

如上图所示,当普通用户没有操作权限时,可以在这条指令前面加上sudo,这样会给普通用户一个短期特权,赋予他root用户的权力,可以成功执行这条语句。执行该命令时,需要输入一个常用密码。

你以为普通用户只要能短时间请求权限就可以像root用户一样为所欲为吗?

可以,但是有一个前提,这个普通用户必须在白名单里,因为他不能做非法操作,所以会加到白名单里,就是因为他不能很好的操作,所以系统信任他。将用户添加到白名单需要使用VIM。如何加入VIM,后面会解释。

Linxu特权管理我们知道特权是限制某些人做某些事情的人。比如,你叫张三,是某某大学的学生。是因为你的名字叫张三,你才能在这所大学学习和生活吗?不,不是因为你的角色。你的角色是这个学校的学生。

当然,人和角色是并存的。只有和这个人在一起,他才能演好这个角色。

同样,Linux给普通用户三个角色,即

文件的所有者、文件的用户、文件所属的组、文件所属的组内的用户以及与文件无关的其他人。业主和其他人很容易理解,但是群体怎么理解呢?

比如

有俩个团队一个是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指令 语法file [选项] 文件或目录…功能说明辨识文件类型。常用选项 -c 详细显示指令执行过程便于排错或分析程序执行的情形。 -z 尝试去解读压缩文件的内容

面对一个文件我们也可以使用file指令来直接查看它的文件类型

可以看到使用file指令后系统就会告诉我们这是一个什么文件上图中dircetory表示这是一个目录empty表示这是一个普通文件。

访问权限

文件名前面的字符不仅能表示文件类型还能表示它的访问权限。上图中的绿色框一共框住了10个字符除了第一个字符还剩下9个字符这9个字符就是用来表示访问权限的。

为什么剩下的是9个呢上面我们说过每个用户都有三个角色所有者(owner)所属组(grouper)其他(other)所以这9个字符给每个角色分3个正好分配完。

如上图中最前面的3个字符是分配给owner的中间的3个是分配给grouper的后面的3个是分配给other的。

每个角色的三个字符所代表的意思都是一样的表示着不同角色下所拥有的权限。这三个字符表示的意思是什么呢

我们知道文件的属性有三种rwx所以这里的三个字符表示的就是不同角色下对文件进行读写执行的权限。

第一个位置表示读可读就是r不可读就是‘-’第二个位置表示写可写就是w不可写就是‘-’第三个位置表示执行可执行就是x不可执行就是‘-’

以上图中的俩个例子来说明

file文件file是一个目录它的所有者可以对文件进行读写执行操作它的所属组可以对它进行读写执行操作其他人可以对它进行读和执行操作。文件test.c是一个普通文件它的所有者可以对它进行读和写操作它的所属组可以对它进行读和写操作其他人只能对它进行读。

这样一来文件的类型和访问权限我们就都描述清楚了描述一个文件的权限时必须从用户的角色以及文件的属性俩个角度出发。

现在文件所在那一行的前10个字符我们已经知道是什么意思了那么剩下的是什么呢

连接数上图中的红色框表示该文件的连接数详细内容本喵以后再讲解拥有者绿色框中是该文件的拥有者这里是用户wxf拥有这个文件所属组深蓝色框中是该文件的所属组这里该文件属于用户wxf这个组文件大小橘色框中是文件的大小单位是字节创建或更改时间浅蓝色框中是该文件的创建时间或者是修改后的时间

此时一个文件名前面的所有字符表示的意思我们就都清楚了可以看到这些字符是在描述这个文件的访问权限和属性。

‍♂️Linxu权限操作

在知道了权限是什么以后我们就可以使用权限了也就是对权限进行操作在Linux下我们通过指令来设置文件的访问权限。

chmod指令 用法chmod [参数] 权限值 文件名功能设置文件的访问权限常用选项 R -> 递归修改目录文件的权限。 说明只有文件的拥有者和root才可以改变文件的权限。

chmod命令权限值的格式

用户符号/-权限字符 用户符号意义u拥有者g拥有者所属组o其它用户a所有用户

上表中是用户符号的。

符号意义向权限范围增加权限代号所表示的权限-向权限范围取消权限代号所表示的权限向权限范围赋予权限代号所表示的权限

上表是设置权限是-的意义

权限字符意义r只读w只写x只执行wrx读写可执行

下面本喵就给大家演示一下如何使用

原本目录file和普通文件test.c的所有者都可以对它们进行读操作执行完红色框中的指令这俩个文件的所有者就不能对他们进行写读作了

如果还是要进行读会发生什么呢 此时对这俩个文件进行读操作时就失败了权限被拒绝。

不仅可以删除一个权限还可以删除多个权限

原本file文件所属组的用户可以对它进行写和执行操作test.c文件所属组的用户可以对它进行写操作执行完红色框中的指令后同时删除了这俩文件对所属组用户的写和执行操作。

此时就无法对这俩个文件进行写和执行操作了。

还可以同时将所有者所属组其他人的全部访问权限都取消

原本这俩个文件访问权限如上图中上面那个绿色框中所示在执行完红色框中的指令后如下面的绿色框这俩个文件对三个角色的任何操作权限都没有了。

当然我们也可以让三个角色对这俩个文件都能进行读写执行操作

原本这俩个文件是拒绝所有普通用户访问的执行完红色框中的指令后这俩个文件就对所有用户都没有访问限制了

这些权限的设置都是针对普通用户的对于root用户是限制不住的。

test.c原本是对普通用户拒绝访问的如上图绿色框使用root用户对test.c文件进行读操作可以看到下面显式出了文件中的内容成功访问转换成普通用户wxf后再对test.c进行读操作系统会报错权限拒绝不允许被访问。

上面例子中又一次体现出了root用户是可以在Linux中为所欲为的。

三位8进制数字

在前面本喵讲过普通用户的每个角色对一个文件的访问权限都有3个字符修改权限时除了使用上诉方法外还可以将将这3个字符写成8进制数一个8进制数表示一个角色的访问权限如 上图中每个角色下的三个字符中 只读被允许也就是r该位写1不允许时也就是‘-’该位写0。按照这个逻辑将三个字符写成一个8进制数。

file目录对普通用户的访问权限写成八进制以后是666.test.c普通文件对普通用户的访问权限写成八进制以后是776.

我们也可以通过这种方式修改文件的权限如

原本这俩个文件对普通用户的访问权限如上图中第一个绿色框所示。执行完红色框中的指令后这俩个文件就拒绝访问了。

这里就是使用的3个八进制数来修改文件权限的。 再尝试一个现在将文件对三个角色的写访问权限都开放

原本这俩个文件是拒绝访问的执行了红色框中的指令后这俩个文件对所有普通用户都开放了只读权限。

因为指令使用的3个八进制数是444写成二进制后是100 100 100代表着的权限是r-- r-- r–所以就全部修改位仅读。

修改权限的操作只有root用户和文件的所有者才能修改其他普通用户是无法修改权限的。

chown指令 格式chown [参数] 用户名 文件名功能修改文件的拥有者常用选项 -R递归将目录及目录下的全部文件修改拥有者

我们之前所有的例子中文件的拥有者都是用户wxf那么能不能修改文件的拥有者呢答案是可以的这就需要用到指令chown来修改文件的拥有者。

当前本喵使用的机器存在着多个用户上面的演示都是用的普通用户wxf。

file文件原本的拥有者是普通用户wxf执行完红色框中的指令后系统反馈操作不被允许

这是因为修改文件的拥有者只能由root用户来做普通用户是没有权限的。

使用root用户执行红色框中的指令后俩个文件的拥有者都从普通用户root变成了普通用户yx如上图中的绿色框。

此时这俩个文件的访问权限就只能由普通用户yx来修改或者是root用户。 如上图普通用户wxf想要修改文件的访问权限是不被允许的因为此时文件的拥有者是普通用户yx而用户wxf是文件的所属组只能操作不能修改权限。

chgrp指令 格式chgrp [参数] 用户组名 文件名功能修改文件或目录的所属组常用选项 -R 递归修改文件或目录的所属组

这俩个文件的所属组都是用户wxf和拥有者一样所属组也是可以改变的这需要用到指令chgrp。

原本这俩个文件的所属组是普通用户wxf以root用户的身份执行完红色框中的指令后这俩个文件的所属组变成了普通用户yx

切记改变所属组和改变拥有者一样必须使用root用户因为只有root用户才有这么大的权限。

此时原本属于普通用户wxf的俩个文件就完全属于普通用户yx了而且是没有商量的余地root用户直接改变他们的所属关系又一次证明了root用户的为所欲为。

文件的拥有者所属组都有改变的指令那么有没有指令来改变文件的其他人呢答案是没有的因为改变了文件的拥有者和所属组其他人的关系也就改变了就像上面例子中将文本拥有者和所属组都是我普通用户wxf的文件改成拥有者和所属组都是普通用户yx那么此时用户wxf就成了other了。

umask指令 格式umask 权限值功能查看或修改文件掩码说明将现有的存取权限减去权限掩码后即可产生建立文件时预设权限。超级用户默认掩码值为0022普通用户默认为0002。常用选项无

一个文件在被创建的时候会有默认的访问权限也就是那个9个字符那么默认的访问权限是什么呢为什么是这个呢

这里用普通用户创建了一个目录dir和一个普通文件txt.c

目录dir一经创建它对三个角色的访问权限是rwx rwx r-x转换成对应的八进制数是775普通文件txt.c一经创建它对三个角色的访问权限是rw- rw- r–转换成对应的八进制数是664

这是为什么呢

对于目录文件系统在创建时给的初始权限是777对于普通文件系统在创建时给的初始权限是666

那为什么现在我们看到的权限分别是775和664呢

这是因为存在权限掩码也就是umask。

仅输入umask我们就能看到umak的值如上方图中此时的umask的值是0002

第一个0不用管只需要看后面的三位可以认为第一个0是为了表示这是一个八进制数。此时的权限掩码是002.八进制002对于的权限就是— — -w-也就是只有文件对其他人的写权限

在创建文件的时候文件的权限 文件的起始权限 - 权限掩码(umask).

所以目录文件的起始权限777去掉权限掩码也就相当于777-002005普通文件的起始权限666去掉权限掩码也就相当于666-002664.

此时我们就清楚为什么文件在创建后它的起始权限为什么是那个样子了。

准确的来讲文件创建后的权限并不是等于文件的起始权限减去默认掩码比如

在指令umask后跟八进制数字0001改变了系统的默认权限掩码此时权限掩码对于的访问权限是— — —x原本目录dir的访问权限是775普通文件txt.c的访问权限是664将原本的文件删除后再重新创建俩个一模一样的文件此时目录的访问权限是776普通文件的访问权限是666我们知道普通文件的起始权限是666创建后的权限还是666说明权限掩码没有起作用。

在创建文件的时候文件的权限 文件的起始权限 & ~(权限掩码) 。

也就是文件的权限等于起始权限和权限掩码按位取反后再按位与。

再看上面的例子

普通文件txt.c系统给的起始权限是666转换成八进制就是此时系统的权限掩码是001转换成八进制就是将权限掩码按位取反后是再与文件的起始权限按位与后是并没有改变。

我们可以这样认为权限掩码中出现的权限都要在起始权限中去掉并不是减。上面例子中权限掩码中出现的权限是x由于起始权限中就没有x所以不需要去掉所以文件最后的权限就是起始权限。

‍♂️Linux的shell

在我们使用的Linux中有一个命令行解释器这个东西就是本喵在输入各种指令的那个界面具体表现为我们可以看到的命令行提示符以及可以输入指令并且执行。

而命令行解释器也被叫做shell也就是外壳程序。

里面的那个紫色的圆圈是Linux内核外面的那个红色的外围全就是shell这二者统称为Linux系统

可以看到shell就是包裹在Linux内核外面的一个壳子。

那么shell到底起什么作用呢

shell是人和Linux内核交流的一个中介

人不善于和Linux内核打交道如果我们直接对Linux内核操作会很繁琐很困难所以我们写各种指令交给shellshell将我们的指令进行解释翻译润色后再交给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的文件但是发现此时删除不了了因为这个公共目录加上了粘滞位。

注意

粘滞位是在多个用户共同使用一个目录时防止用户之间互删文件才使用的。当一个目录被设置位粘滞位时则该目录下的文件只能由root用户目录的拥有者文件的拥有者删除。 ‍♂️总结 目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限则无法对目录执行任何命令甚至无法cd 进入目, 即使目录仍然有-r 读权限这个地方很容易犯错认为有读权限就可以进入目录读取目录下的文件。而如果目录具有-x权限但没有-r权限则用户可以执行命令可以cd进入目录。但由于没有目录的读权限所以在目录下即使可以执行ls命令但仍然没有权限读出目录下的文档。

权限是非常重要的只有搞明白了权限才能进行正确的访问和操作只有设置对了权限才能保证文件的安全性和可用性。