ARTICLE DETAIL

建站实战干货

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

Linux-Linux的权限

2026/8/9 15:04:57 拓冰建站 浏览量
Linux-Linux的权限

目录

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。只有tanroot有权更改它的权限(root享有最高权限,可以无视权限约束)。第二个tan说明所属组是谁,即表示这个文件属于用户组tan。同组下的其他用户(比如你创建的dan,如果被加入了 tan 组)会享有第二组权限(rw-)。

那么为啥没有other的提示?

因为对一个文件来说,只有三种人,那就是所有者、所属组、other,所以除了所有者和所属组以外的所有人都是other!

那么72和4096分别代表什么意思?

这两个都代表:文件大小(单位:字节),72代表这个文件有72B,4096不是代表这个文件夹里的所有内容加起来已经有4096B了,因为在test目录下是没有任何文件的:

至于为啥为4096是因为:大小 4096 字节是 Linux 下空目录的默认最小占用空间

Aug 7 8:14代表的是文件最后修改时间为8月7日8点14分,这个不一定是北京时间。它取决于你虚拟机当前设置的时区,不能直接断定是北京时间。可能是:世界协调时间(UTC),有些机器显示的时间为北京时间,我们可以通过:

date

直接查看当前系统的时间和时区:

可以看到现在的时间为2026年8月8日星期六凌晨1点59分02秒,但是后面有个UTC,这代表世界协调时间,北京时间需要在这个基础上加8小时(因为北京位于东八区),所以真正的北京时间应该为9点59分02秒,对应刚才文件修改时间应该为北京时间8月7日16点14分。

如果自己的系统为北京时间,那么这个UTC的位置应该为CST(China 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 u+x 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 g+rw code.c

也就是说,如果所属组的r权限已经存在,那么我们也可以直接+rw,并不会有什么影响。

如果我想把所属组变成没有任何权限,那么我们可以:

这种把所有权限结合在一起的方式适合我们想要把某类人的权限改成什么形式的情况或者我们不想用ls -l查看权限多一个步骤的情况。

但是我想一个一个修改也太麻烦了,有没有一种一条命令就全部改完的操作?

有的,如果我们想把拥有者去掉可读可写,所属组加上可读可写,other加上可写可执行可以:

chmod u-rw,g+rw,o+wx code.c

那么我们能不能交换u和g和o的顺序呢?我想先g再o再u行不行?

我们让所有者加上rw权限,所属组减去r权限,other去掉wx权限有:

chmod g-r,o-wx,u+rw code.c

chmod相对来说比较方便,我们可以直接改顺序也不会有问题!

但是这种方式还是太鸡肋了,这么多字母和+/-我怎么记得住?

有另外一种方式,可以用数字来改权限!

2.2通过八进制数字的方式修改文件的权限属性

因为每个位置都只能存在两种字符,所以,我们可以把-看成0,r/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的所属组和拥有者里面的一个,所以它是other,other没有权限,对于目录来说,x是执行权限,有了x权限便能进入该目录的权限,即有“通行”的钥匙,进都进不去,所以要在tan或root下执行:

chmod o+x /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 o+r /home/tan

此时在dan就可以:

此时我们如果在dan上进行:

touch te rm code.c mkdir te mv code.c code.e

这些操作是都不能进行的:

这是因为dan(other)没有写(w)的权限,没有写的权限也就代表你不能touch(新建文件)、rm(删除文件)、mkdir(创建子目录)、mv(重命名文件)。

此时我们就需要在root或tan上执行:

chmod o+w /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用户操作时,加sudo:

sudo 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操作等。

我们把这个文件所有权限置为0:

chmod 000 code.c

r权限:

有这个权限,我们可以查看文件的内容,执行下面操作:

cat、less、more或vim的只读模式,但是此时我们都不能执行:

就算我们vim code.c了,也看不了:

哪怕我们使用i进入insert也不行:

所以只能用Ctrl+Shift+z退出!

我们加个r权限:

此时我们用这些指令:

vim最后一行代表我们只能read only只读!

w权限:

修改文件内容,如使用:nano,vim,echo >等,但现在不行:

nano code.c后界面

vim code.c界面

但是我们给它增加权限就可以改了:

这个就不演示了,因为nano和vim都要到后面讲。

x权限:

如果这是一个可执行的程序(比如编译好的二进制文件)或脚本(如.sh.py),拥有x权限后,你可以这样运行它:

./code.c

此时如果./code.c有:

而我们加上x权限:

chmod u+x 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 o+w shared_tandan

此时我们在普通用户下就可以执行这个命令了:

cd /shared_tandan

此时我们 就可以在普通用户创建文件了:

但是这个文件不是公用的:

要使这个文件共享我们需要使other能够读能够写,因此:

chmod o+rw thetan.txt

但是此时我在另外一个账号dan却能进行删除thetan.txt的操作:

为啥会这样呢?

因为在共享目录下,每个人都有删除的权限,即每个人都有w权限。就可以互相删除文件!

所以这种方式虽然可以实现共享,但是会存在互删的情况!

要么就把该目录对所有人的w权限删掉,此时就无法创建任何文件了!

此时在普通账号执行touch和mkdir操作:

这种方式避免了互删,但是也无法创建新文件和新目录了!

这个时候就需要用到我们之前所用的粘滞位了:

chmod o+t /shared_tandan

此时再在root下执行:

chmod o+w /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命令在我们不知道文件信息的时候无脑用就行!