Linux-Linux的权限 📅 2026/8/9 14:40:03 目录1.对权限的理解2.文件的权限属性的修改2.1通过u/g/o /- r/w/x的方式修改文件的权限属性2.2通过八进制数字的方式修改文件的权限属性2.3目录权限的意义2.4文件的所有者和所属组的修改2.5普通文件权限的意义2.6通过修改起始权限的方式来修改文件的权限属性2.7如何实现数据共享2.8如何知道文件类型1.对权限的理解当我们在目录下进行ls -l操作时会出现如下界面其中第一行的total 8 代表当前目录下的文件和目录总共占用了 8 个磁盘块通常一个块是 4KB 或 1KB可以理解为“这些内容占用的大致空间总量”日常使用中可以忽略不看它不影响你对文件属性的理解。观察第二行仔细观察发现第一个字符串有很多字符这些代表什么意思在上一篇博客讲到第一个字符为-代表为普通文件而第一个字符为d代表为文件夹那么后面的9个字符代表什么意思呢实际上这9个字符可以三三一组其中前三个代表所有者user权限中间三个代表所属组group权限最后三个代表其他人other权限那么对于每一种人对应的权限分别代表什么意思呢每一种人的第一个字符为r/-r/-代表用户是否有可读权限是否可以查看文件内容的权限如果第一个字符为r则可读否则不可读。第二个字符为w/-w/-代表用户是否有可写权限是否能修改文件内容的权限如果第二个字符为w则可写否则不可写。第三个字符为x/-代表用户是否具有可执行权限是否可以运行该文件的权限如果第三个字符为x则代表用户可执行否则不可执行所以我们对code.c文件的权限可以表述为对所有者可读可写但不可执行对所属组可读可写但不可执行对other仅可读对test文件夹的权限可以表述为对所有者可读可写可执行对所属组可读可写可执行对other可读可执行但是不能写。那么1和2分别代表什么意思呢1代表该文件有1 个硬链接。对于普通文件这个数字通常是 1如果是目录数字通常大于等于 2代表子目录数量。这个字段对我们了解文件没有太大的关系可以不管。后面的tan tan代表什么意思第一个tan说明所有者是谁即表示这个文件属于用户tan。只有tan和root有权更改它的权限root享有最高权限可以无视权限约束。第二个tan说明所属组是谁即表示这个文件属于用户组tan。同组下的其他用户比如你创建的dan如果被加入了 tan 组会享有第二组权限rw-。那么为啥没有other的提示因为对一个文件来说只有三种人那就是所有者、所属组、other所以除了所有者和所属组以外的所有人都是other那么72和4096分别代表什么意思这两个都代表文件大小单位字节72代表这个文件有72B4096不是代表这个文件夹里的所有内容加起来已经有4096B了因为在test目录下是没有任何文件的至于为啥为4096是因为大小 4096 字节是 Linux 下空目录的默认最小占用空间。Aug 7 814代表的是文件最后修改时间为8月7日8点14分这个不一定是北京时间。它取决于你虚拟机当前设置的时区不能直接断定是北京时间。可能是世界协调时间UTC有些机器显示的时间为北京时间我们可以通过date直接查看当前系统的时间和时区可以看到现在的时间为2026年8月8日星期六凌晨1点59分02秒但是后面有个UTC这代表世界协调时间北京时间需要在这个基础上加8小时因为北京位于东八区所以真正的北京时间应该为9点59分02秒对应刚才文件修改时间应该为北京时间8月7日16点14分。如果自己的系统为北京时间那么这个UTC的位置应该为CSTChina Standard Time很多云服务器和虚拟机最小化安装时默认是 UTC。如果想把系统时区改成北京时间方便日常查看可以在root下或普通账号加sudo执行timedatectl set-timezone Asia/Shanghai此时再用date就可以看到为CST了最后的code.c和test代表文件名字不同的颜色代表不同的文件类型这个受自己在Xshell设置的因素影响如果想要知道是什么文件类型建议看每一行的第一个字符2.文件的权限属性的修改若想更改文件的所有权限一般都是文件拥有者才能修改而文件拥有者通过chmod指令来修改文件的权限属性一般修改文件属性有比较多的方式不过一定要在创建文件的所有者的账号下进行修改权限否则没法操作2.1通过u/g/o /- r/w/x的方式修改文件的权限属性u即代表user所有者g即代表group所属组o代表other其他人/-代表增加/减小权限。这是code.c的原始文件权限如果我想给拥有者增加可执行权限chmod ux code.c如果我想给所属组减少w权限chmod g-w code.c如果我想给other减少r权限chmod o-r code.c如果此时o没有r权限那我们还是用chmod o-r code.c会不会出问题报错显然无事发生我们可以大胆改权限不用害怕报错那这样也太不方便了我还需要先ls -l看一下它有什么权限再进行修改能不能直接让r和w和x直接结合呢我想把所属组的权限改为可读可写不可执行则chmod grw code.c也就是说如果所属组的r权限已经存在那么我们也可以直接rw并不会有什么影响。如果我想把所属组变成没有任何权限那么我们可以这种把所有权限结合在一起的方式适合我们想要把某类人的权限改成什么形式的情况或者我们不想用ls -l查看权限多一个步骤的情况。但是我想一个一个修改也太麻烦了有没有一种一条命令就全部改完的操作有的如果我们想把拥有者去掉可读可写所属组加上可读可写other加上可写可执行可以chmod u-rw,grw,owx code.c那么我们能不能交换u和g和o的顺序呢我想先g再o再u行不行我们让所有者加上rw权限所属组减去r权限other去掉wx权限有chmod g-r,o-wx,urw code.cchmod相对来说比较方便我们可以直接改顺序也不会有问题但是这种方式还是太鸡肋了这么多字母和/-我怎么记得住有另外一种方式可以用数字来改权限2.2通过八进制数字的方式修改文件的权限属性因为每个位置都只能存在两种字符所以我们可以把-看成0r/w/x看成1也就是说rwx代表111此时我们可以把111转化成为八进制为7那么如果想要修改某个人的权限为r就是100转化为八进制为4数字的方式非常方便比如我想把u权限改为rw即为6把g的权限改为r即为4把o的权限改为啥都没有即为0可以chmod 640 code.c这种修改方式相对于前面的方式简单了很多我们可以随意修改任意人的属性不过需要注意二进制和八进制的转化否则可能会出问题2.3目录权限的意义说了这么多我们改了这么多权限真的有用吗此时我们可以看到对于other的权限为什么都没有真的是这样吗我们新开一个用户名为dan的主机此时我们把其路径换到/home/tan/8.7发现权限拒绝了为啥这是因为tan目录这个也有权限我们可以通过ls -l /home来查看普通用户的家目录的详细信息因为dan没在tan的所属组和拥有者里面的一个所以它是otherother没有权限对于目录来说x是执行权限有了x权限便能进入该目录的权限即有“通行”的钥匙进都进不去所以要在tan或root下执行chmod ox /home/tan此时在dan下就可以进了那么如果没有x权限则①不能执行cd /home/tan指令无法进入该目录②即使你知道里面有8.7文件夹你也无法进入任何子目录也无法访问里面的任何文件。因为 Linux 访问路径需要逐级开门。此时我们虽然可以进去了但是我们执行ls /home/tan会有这是因为没有r权限r权限没有就看不到菜单尽管你知道目录下有个8.7你可以进去但是却不能看到目录/home/tan)下的其他文件也就是说没有“查看柜门上的标签清单”的能力。没有r权限则①不能执行ls /home/tan指令无法列出目录下的内容②你看不到里面有什么文件。但是如果你知道里面某个文件或子目录的完整名称比如你记得有个8.7文件夹并且该子目录本身有x权限你依然可以cd /home/tan/8.7进去因为x只管“通行”r只管“查看列表”。如果此时我们在tan路径下执行chmod or /home/tan此时在dan就可以此时我们如果在dan上进行touch te rm code.c mkdir te mv code.c code.e这些操作是都不能进行的这是因为danother没有写w的权限没有写的权限也就代表你不能touch新建文件、rm删除文件、mkdir创建子目录、mv重命名文件。此时我们就需要在root或tan上执行chmod ow /home/tan此时在dan下就能执行在/home/tan下才行不能再/home/tan/8.7下因为它的权限还没修改但是我们一旦执行rm -r 8.8有为啥呢因为实际上8.8也是有属性的8.8对dan来说没有w权限也就不能删除也就是说我们删除一个文件不是看目录属性而是看目标文件目录的属性2.4文件的所有者和所属组的修改回到tan下我们可以看到当前的所有人和所属组为tan tan如何修改呢用chown即change owner修改所有者chown dan code.c但是会出现这是因为只有root账号才能修改文件的所有者为啥①chown属于系统级管理操作它修改的是文件底层记录的UID用户ID②如果允许普通用户随意转移文件所有权会产生安全隐患比如A用户写了一个木马然后改所有权为root虽然改所有权不等于提权但会造成混乱。③Linux 的设计哲学是只有root才能决定“这个文件是谁的”。所以只有两种办法解决在tan用户操作时加sudosudo chown dan code.c输入tan对应的密码就能修改了代表tan原所有者为这个文件负责还有一种方法就是在root下执行刚刚的代码不用加sudo如果想要修改文件所属组则需要使用到chgrp即change group指令sudo chgrp dan code.c虽然我修改了文件的所属组和所有者但是我仍然能执行rm code.c这是因为删除文件这个事情本质不是看“文件本身”的权限而是看“文件所在目录”的权限即便是超级用户root也不能违反因为你是这个文件的原始创建者你肯定有/home/tan/8.7这个目录的写权限w所以即便文件所有权给了别人你依然能把它删掉。这就是为什么常有人说“文件归文件目录归目录”。在 Linux 底层文件内容存在硬盘的数据区而文件名只是写在父目录里的一个“清单条目”类似一张门票上的编号。修改文件内容写w操作的是文件数据区看的是文件的w权限。删除文件名rm操作的是父目录的清单看的是目录的w权限。因为①你在/home/tan/8.7目录下操作②这个目录的权限是drwxrwxr-x所有者是tan你对它有w写权限。③你执行rm code.c时系统只是在/home/tan/8.7这个目录的清单里把code.c这个条目划掉了。④系统压根不会去检查这个文件归谁所有因为你是目录的主人有权整理这个文件夹。那这样不就代表所有人都能删除目录里的文件不就乱套了在公共目录下我们可以设置一个粘滞位设置权限最后一位为t就行如权限位最后是t如drwxrwxrwt。因此①在加了粘滞位的目录下即使你有目录的w权限也删不掉别人创建的文件只能删自己的。②但在你的/home/tan/8.7里并没有这个限制所以作为目录主人你拥有绝对的“清扫权”。粘滞位这个概念需要各位自己去了解了因为只要你想不被别人乱删文件就可以设置2.5普通文件权限的意义此时我们再创建一个code.c文件有此时我们先把code.c里面随便写一下代码此时我们是可以正常编译执行的也能执行r操作等。我们把这个文件所有权限置为0chmod 000 code.cr权限有这个权限我们可以查看文件的内容执行下面操作cat、less、more或vim的只读模式但是此时我们都不能执行就算我们vim code.c了也看不了哪怕我们使用i进入insert也不行所以只能用CtrlShiftz退出我们加个r权限此时我们用这些指令vim最后一行代表我们只能read only只读w权限修改文件内容如使用nanovimecho 等但现在不行nano code.c后界面vim code.c界面但是我们给它增加权限就可以改了这个就不演示了因为nano和vim都要到后面讲。x权限如果这是一个可执行的程序比如编译好的二进制文件或脚本如.sh、.py拥有x权限后你可以这样运行它./code.c此时如果./code.c有而我们加上x权限chmod ux code.c此时我们可以执行但是因为它本身不能执行所以会报错之后我们会讲到gcc然后再执行这个不是重点所以可执行权限和能执行是两码事一个可执行文件可执行权限本身能执行x只能代表你可以进行执行操作但这个文件能不能执行谁都不知道2.6通过修改起始权限的方式来修改文件的权限属性我们开始创建文件时直接看它的权限有为啥在一开始Linux的文件普通文件或目录新建的时候就有权限呢这和C设置的缺省参数时一个道理这个也相当于缺省权限。为什么普通文件的起始权限为664目录文件的起始权限为775呢用umask指令可以看到超级用户的umask默认为0022而普通用户的umask默认为0002.umask是 Linux 系统的内置命令只要你的终端能用它就能用不需要额外安装。它的作用是设置一个“权限掩码”用来控制你新建文件或目录时的默认权限。这个数字的含义是从最大权限文件666目录777中“减去”这个掩码值就得到了新建文件的默认权限。也可以理解为过滤掉在权限掩码中出现的权限因此我们的新建普通文件应该为666-002为664即rw-rw-r--新建目录应该为777-002为775即为rwxrwxr-x。最终权限起始权限去掉umask。不同系统umask默认值可能不一样但是我们可以设置权限掩码如设置成777可以umask 777此时创建文件就有最好还是把umask改为系统默认的防止出问题2.7如何实现数据共享一般我们不能把这个目录放到普通账户的路径下因为这样普通用户访问不了且root下是公共的目录所以只能放到root的路径下执行以下操作即可此时我们需要给other 加一个w权限才行chmod ow shared_tandan此时我们在普通用户下就可以执行这个命令了cd /shared_tandan此时我们 就可以在普通用户创建文件了但是这个文件不是公用的要使这个文件共享我们需要使other能够读能够写因此chmod orw thetan.txt但是此时我在另外一个账号dan却能进行删除thetan.txt的操作为啥会这样呢因为在共享目录下每个人都有删除的权限即每个人都有w权限。就可以互相删除文件所以这种方式虽然可以实现共享但是会存在互删的情况要么就把该目录对所有人的w权限删掉此时就无法创建任何文件了此时在普通账号执行touch和mkdir操作这种方式避免了互删但是也无法创建新文件和新目录了这个时候就需要用到我们之前所用的粘滞位了chmod ot /shared_tandan此时再在root下执行:chmod ow /shared_tandan此时我们在普通账号下touch后在另外一个账号rm试一下呢但是我们可以在自己创建的文件中执行删除操作在root下也能删除掉这个文件因为是root创建的。当一个目录被设置为“粘滞位”则该目录下的文件只能由①超级管理员root删除②该目录的所有者删除③该文件的所有者删除。粘滞位只能对目录的删除操作限制2.8如何知道文件类型我们虽然通过ls -l可以看它们最开始的字母从而知道文件类型但是我们却需要记住太多Linux有一个指令file指令显示文件更详细信息我们需要先下载Ubuntu使用如下指令sudo apt update sudo apt install file -y然后使用mkfifo cerr可以创建一个管道文件然后此时我们再用file cerr看一下同理我们还可以用来查看更多的总之file命令在我们不知道文件信息的时候无脑用就行