ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux---权限

2026/9/8 19:50:38 拓冰建站 浏览量
Linux---权限 基本认知什么叫做权限当我们去访问资源的时候权限就是限制我们能还是不能的问题。为什么要有权限Linux是一个多用户操作系统一台机器同时可能会有多个人来进行登录访问最常见的就是普通用户和root如果没有权限例如普通用户可以访问root里的文件那万一出了错责任归谁因此权限本质是为了更好的进行用户管理。权限人文件属性权限是针对特定群体(与人有关)的就比如你想进某个大学但是你并不是里边的学生那就无权限进去但你如果是里边的学生就有权限进去Linux里的特定群体就是普通用户和root。除了人权限还得需要目标主体天然具备对应的属性才能访问仔细想想你能去腾讯视频里敲代码吗即使腾讯视频有权限让你进去但它根本没有对应写代码的属性。反观LinuxLinux下一切皆文件则对Linux的任何操作都避不开文件文件就是Linux里权限的目标主体它的属性就是可读(r)可写(w)可执行(x)。权限Linux用户的问题Linux里有两类用户一个是普通用户一个是超级用户root。其中root在百分之99的情况下不受权限约束属于Linux系统中的特权级别普通用户受权限约束。root和普通用户之间可以进行账号切换root切换到普通账号su 账号名就切换到了对应名字的普通用户(不需要密码)。普通账号切换到rootsu root或者su或者su -(为什么只要su因为Linux系统里只有一个root账号)并且还要输入root的密码。普通账号之间切换su 账户名并且还要输入对方的密码。ctrld退到上一个登录的用户账号下。注su是只进行账号切换不改变当前的工作路径(家目录还是上一个账号的)su -是让目标用户已重新登录的方式进行账号切换(家目录变成了当前账号的)。每一个人安稳用自己的账号就行。(上述这种情况是普通账号跟root账号是同一个人)现在我们基本知道了root和普通账号之间是存在着一定的权限差距的那如果说普通账号想做提高权限的事情就比如说在Linux系统里安装软件需要拷贝到指定的目录下操作系统不让普通账号进行拷贝那难道说安装个软件还需要请root账号亲自来做吗当然不是如果普通账号有成百上千个那root一个个去搞不得累死。因此Linux系统里有个指令叫sudo可以让普通账号进行指令短暂提权的。第一次用sudo需要输入一次密码之后会有十几分钟用sudo的时候不需要。(上述这种情况是普通账号跟root账号不是同一个人)关于上述sudo肯定有人有疑惑说我使用的时候为什么要求输入我当前自己的密码当然可能现在大家根本就用不了sudo这个下边说现在先讨论为什么输入自己账号的密码如果输入自己账号的密码怎么感觉root账号形同虚设普通账号不就想提权就提权了吗先明确一个点这里肯定是不能输入root的密码的因为root的密码不可能给所有人都知道吧另外普通用户默认是执行不了sudo的(虚拟机除外)这也就不存在root账号形同虚设之说。如何使用sudo首先在用sudo的时候系统会弹出来一句话叫不在sudoers文件里那这个文件是什么呢sudoers是root超级管理员的配置文件任何人无法直接查看这个配置文件只有root才可以去访问修改这个文件相当于是一个白名单白名单的意思就是在这个名单里的用户都不用做身份验证像比如你是校长的儿子进学校的时候保安问都不问直接就让你进去了但是换做其他学生保安会叫说要看看学生证。不在白名单里的用户都默认是不许用sudo的Linux系统使用这种名单机制去限制普通用户能否提权并且如果有人恶意去删除修改文件也可以直接去白名单里查找缩小了查找范围。总结一下一个普通用户能用sudo一定是经过root管理员认证过的因为必须要将其添加到白名单里才能使用而白名单只能由root进行访问修改这也就解释了为什么普通账号用sudo的时候只要输入自己的密码就可以进行短暂提权了。Linux角色的问题权限是依附于角色的就像你充了腾讯视频的会员可以看里边的VIP视频是因为你这个人还是因为你是会员Linux里常见的有三种角色拥有者角色(文件的创建者)所属组角色(文件属于哪个组)other角色(不是拥有者不是所属组就是other系统里没有为它专门设置一栏属性)。Linux里的用户跟角色有什么关系呢角色是需要人来扮演的比如说用户有一个root账号而root在文件属性里的角色为拥有者/所属组。就像一个人叫张三他的角色是校长明天换李四当校长角色还是校长。角色和用户是互补的关系角色一直在那但人可以变。所属组是什么为什么要有所属组在日常开发的过程中通常是一个小组一起开发肯定是共用文件的这时候它们用到的就是组级别权限简单理解就是拥有者创建的文件不许other看但允许一个小组里的人看所属组就是对文件权限进行局部范围的组级别管理。文件权限属性的问题文件的权限主要分为只读(r)只写(w)可执行(x)三种。了解了对应的意思之后就可以去表达一个文件的权限了以文件dst.txt为例该文件的拥有者为root所属组为root(注意所属组可以只有一个人)该文件所对应的拥有者的权限为可读可写不可执行所属组的权限为只读不可写不可执行other的权限为只读不可写不可执行。权限的指令操作修改文件属性chmod可以修改文件的权限。假设现在要操作的文件是text.txt。u表示拥有者g表示所属者o表示other-表示去掉某个权限表示加上某个权限a表示all对所有角色的权限一起修改。补充对于超级用户来说上文说过root账号可以用su随意切换到普通账号不用输密码。对于文件权限来说root也不受文件权限的限制文件权限只对普通账号有限制。假设现在我登录了一个叫做xxc的普通账号并且创建了一个叫text.txt的文件我还将这个文件对于other的权限chmod成了不可读不可写不可执行另外此时root对于text.txt来说是other但由于它的超级用户不受文件权限的限制依旧可读可写可执行。细节1对于一个文件来说只有该文件的拥有者才能使用chmod去修改任意角色的权限。现在假设xxc是这个文件的拥有者他将自己的权限改成了不可读不可写不可执行(至于这种情况对应的场景大模型一搜就知道了)但是他又是文件的所属组所属组的权限是可读可写不可执行那此时xxc还是否能读写这个文件呢实践可知不行。另外通过这个也可以知道当没有对应权限的时候系统会打印Permission denied。原因就是用户访问文件的时候确定自己相对于文件的身份角色只会验证一次。换句话说权限只会验证一次。意思就是现在我登录的这个账号名叫xxc用这个账号创建了一个text.txt文件也就是xxc创建了一个text.txt文件他是文件的创建者这个事比xxc是文件的所属组先确定下来(当前登录账号的用户名(xxc)之于文件权限所对应的角色从左往右依次确定这里指的从左往右看的是ll打印出来的那个顺序下图中圈出来的)因此系统不会再去验证xxc的身份就导致xxc对于该文件的权限就是不可读不可写不可执行。那么如何验证这个事呢其实上边已经间接验证了因为当把xxc的权限修改成---之后再去echo或者cat就Permission denied了这也就说明身份只验证了一次不然不就可以echo和cat吗。现在再直接验证一下我要保证文件的拥有者和文件的所属组不是同一个人这样就能知道当xxc不是拥有者的时候是否能匹配上所属组的可读可写权限。由下图可知当我改完拥有者之后xxc的角色就从左往右匹配先匹配看看是不是拥有者不是拥有者现在是root继续往右匹配到了所属组是的并且text.txt这个文件的所属组角色具有可读可修改的权限因此xxc此时就可读可修改了这也就直接验证了上边的结论。细节2关于文件的可执行权限chmod可以修改文件的权限那是不是就是说如果将文件的权限修改成了可执行就代表这个文件可以执行了呢不是的文件要被执行要满足两个条件一个是该文件本身就是一个可执行的文件第二个就是文件本身具有可执行权限。所以有x权限只是其中一方面而已。给x权限不是能让你从不可执行的文件变成可执行的文件而是这个文件本来就可执行当你给x权限的时候你想执行OS允许你执行。谈完了上边的两个细节之后接下来谈一谈修改文件属性的第二个方案叫做8进制方案。什么意思修改人上边修改的一切都归结为在修改文件的属性现在该谈谈人了因为权限人文件属性。已经过说那9个字母每三个为一组分别代表的是拥有者权限所属组权限other权限另外ll的时候两个账号名分别表示的是拥有者和所属组。我们是没有办法去修改它们的举个例子没法将第一组的三个字母本来表示的是拥有者权限现在将它的意思改成所属组的权限其他的同理但是我们可以修改拥有者和所属组举个例子现在拥有者为xxc将其改成root。也就是说每个位置对应的角色不可以变但是该角色对应的人可以变。以root账号修改人为例因为root账号权限最大。chown改变拥有者角色对应的人chgrp改变所属组角色对应的人chown还可以将拥有者和所属组角色对应的人一起改变了。注意没有指令去修改other因为不是拥有者不是所属组的就是other改变拥有者和所属组的时候就是在改变other。上文说过文件的拥有者可以修改文件的权限那我现在text.txt文件的拥有者为xxc他是否能修改文件的拥有者或者所属组角色对应的人呢答案是不行的拥有者只能修改角色之于文件的权限(就是那3个为一组的9个字母)。拥有者在修改文件权限的时候不会影响他人因为这个文件修改了权限之后还是拥有者自己的但是当拥有者想去修改拥有者或者所属组的人的时候你把东西给别人是不是要征得别人的同意但在Linux里没法去征得别人的同意这个时候就让超级用户去强制给或者sudo提高权限去给就算出了错那也能断定一定是在白名单里好查。关于文件类型的补充Linux的文件类型里不以文件后缀作为区分。-普通文件源代码文本动静态库可执行d目录///////////////////////////////////////////////////////////////////////////////l链接文件p管道文件c字符文件(字符设备)(典型的是显示器键盘按照顺序IO不支持随机读写以字节为单位进行读写)样例当用printf在屏幕上打印1234的时候其实是按字符打印的而不是以整体1234这个整数打印的。scanfcincout都是如此因为显示器是字符设备。b块设备文件(典型的就是磁盘其支持随机读写(以块为单位一般是4KB)速度快)三个子问题问题1目录权限问题如果要进入一个目录需要什么权限。目录也有对应的rwx三种权限。(注意以下的rwx说的都是对目录的影响但是不影响对目录里文件的操作对文件的操作需要的是文件的权限就比如向文件写入只要文件特定的角色有w权限就可以)r表示用户是否有权力查看目录底下的所有文件。w决定特定用户是否有权力在目录下增加删除文件和修改文件名。x决定了用户角色是否可以进入目录关于目录的rwx之所以是那样的可以暂时先这么理解Linux下一切皆文件因此目录也是一个文件文件文件内容文件属性对于目录来说它的内容是目录下所有文件的属性在目录里新建文件就相当于往目录里增加了新建文件的属性没有w权限这是不允许的。读权限也同理目录也是文件它的内容是目录下所有文件的属性没有r权限就读取不了文件的内容也就是目录下所有文件的属性。(为什么说暂时这么理解是因为这个表述还有点问题因为目录没有w权限不能修改目录里文件的文件名但是可以修改文件的属性。)问题2为什么我们新建的目录和起始文件是我们看到的样子。对于普通文件起始权限是从666开始的对于目录文件起始权限是从777开始的中间的差别就是差了x权限对于大部分普通文件来说都只是普通的文本文件不需要被执行因此x权限就默认没有了而对于目录来说创建目录就是为了访问因此x权限是默认带上的。但是我们实际看到的是664和775这是为什么呢因为在Linux系统中为了对权限进行细粒度(更精细的做权限管理)控制因为不想让other有太大的权限有个叫Linux权限掩码的东西umask指令可以查看Linux系统的权限掩码第1位的0先不管后3位002是权限掩码。上文说的666777叫起始权限权限掩码的意思就是凡是在权限掩码中出现的权限都应该从起始权限里去掉。新建文件/目录的最终权限(就是我们肉眼实际看到的664775) 起始权限去掉权限掩码中出现的权限权限掩码是8进制的也就是002变成2进制是000 000 010新建文件的起始权限是666也就是110 110 110权限掩码里对应other的权限是010其中w权限出现在了权限掩码里所以就将起始权限里对应other的w权限去掉由1变成0因此新建文件的最终权限为110 110 100即为664。(新建目录同理)。(误区公式里所说的去掉不是指的减法真正计算最终权限的方式是最终权限 (起始权限) (~权限掩码)解释一下111100010000也就是说1跟任何二进制数之后得到的还是原来的二进制数字说白了就是保留原始位数字不变0跟任何二进制数之后会将原来的二进制数字清0。之前又说过在权限掩码中出现的权限(为1的位)要在起始权限中去掉(清0)因此要先~在。实践那我们是不是可以通过修改权限掩码的方式去修改最终权限umask 3位8进制数字例如umask 000则将权限掩码修改成了000。注意这只是临时修改权限掩码关掉重新登录一下之后权限掩码就会恢复成系统默认的了而且不同系统下默认的权限掩码可能不一样这都很正常。问题3如果我们新建的一个文件是不可读不可写不可执行的可以删掉它吗粘滞位问题。假设现在在你账号的一个家目录里边有一个root账号创建的文件这个文件是---的对于这个文件来说你是other然后你看到这个文件是---的你就把它删了并且还删成功了你觉得合理吗其实是合理的因为我要删除文件需要的不是文件的权限而是文件所属目录的w权限只要文件所属的目录有w权限就可以删除文件。还有一个比较好理解的角度就是当前这个目录是我的假设账号名叫xxc而root账号进入到xxc的目录里边去新建了文件还设置成---虽然xxc确实---了但是当前这个文件所属目录是xxc的xxc有删除这个文件的权力。结论指定目录下一个其他人新建的文件(即便是root)不让rw但是可能我们普通用户可以删掉。这个可以删掉的本质是这个目录就是这个普通用户的(就是这个目录的拥有者是这个普通用户因为拥有者可以修改目录的权限只要目录有w权限就可以删除里边的文件)。如果我们今天想让多用户之间共享文件怎么办首先要明确这个共享文件一定不可能出现在某个任意用户的家目录下因为多个普通用户之间是无法进入对方的家目录以及家目录的子目录的因为家目录默认是对所属组和other是---的并且即使是root可以进入普通用户的家目录普通用户也有删除root所创建的文件的权力。(*是通配符指代任意字符-d表示只显示目录本身不显示目录里的文件)既然不能在家目录里共享文件那就只能去系统级别的路径下了也就是根目录/sudo一下去根目录里新建一个目录将文件写在根目录里边去共享。假设下图的shared目录里的name.txt就是两个用户之间共享的文件此时有第3个用户进入了这个目录因为这个目录对于other是有x权限的并且还有w权限所以这第3个用户把name.txt删除了合理吗从技术角度是合理的因为只要目录有对应的权限就可以做到但我现在的场景是shared是我们共享的目录里边文件的权限由文件的拥有者去设定别人可不可读写这都没有问题不过我不想随便哪个人都可以来删除我这个文件跟我共享可以你可以r和w但不想你删除肯定有人会想此时把shared目录的w去掉不就可以了吗但是去掉之后我自己都不能删除我自己的文件了因此对于这种场景在共享目录里每个用户自己创建的文件只能自己删除别人对这个文件只能r或者w或者x或者---此时就需要一个权限去凌驾于w权限之上称为粘滞位t。(前提条件肯定这个目录本身对于你这个角色有w权限)(t就表示粘滞位这个权限然后写指令的时候不用去指定ug或者o)加完之后会发现shared目录原来对于other的x权限的位置变成了t这种权限。总结一下粘滞位是给other设置的一种权限管理级别在带有粘滞位t的目录下每个人新建文件删除的时候只能自己删自己的不能因为目录有w权限而删除别人的文件粘滞位通常用来做文件共享的场景。只有三类人可以在带有粘滞位的目录下删除文件超级管理员该目录的所有者该文件的所有者(说白了就是自己删自己的)。补充Linux系统里的根目录/下有一个目录tmp其本身就是共享的目录并且设有粘滞位这个目录下通常保存系统里各个用户所形成的临时文件、临时数据。