目录

前言

一、权限是什么

二、Linux中的用户区分

三、文件属性

1.文件类型

2.访问的身份

3.访问权限属性

四、文件访问权限的修改方法

1.修改权限属性

chmod

2.修改文件角色归属

chown

chgrp

五、文件的默认权限和实际权限

umask

六、粘滞位


前言

今天我们来聊一个 Linux 里非常基础,但又特别容易混淆的知识点:权限

很多同学刚开始学 Linux 时,看到一串类似这样的内容

-rw-r--r-- 1 user user 1024 test.txt
drwxr-xr-x 2 root root 4096 mydir

第一反应可能是:这是什么神秘代码?

其实它一点也不神秘。Linux 权限本质上解决的就是一句话:

谁,能以什么方式,操作这个文件或目录?

只要把“谁”和“怎么操作”这两个问题搞清楚,权限这一块就会清晰很多。

一、权限是什么

在 Linux 系统中,权限指的是操作系统用来控制用户访问文件或目录的一种机制。谁可以访问某个文件或目录,以及可以用什么方式访问。例如,一个用户是否可以查看文件内容、修改文件、执行程序,或者进入某个目录,都是由权限来控制的。

Linux 中的权限主要受到两个因素影响:

第一,文件或目录本身的属性。
每个文件或目录都会记录自己的权限信息,例如是否允许读取、写入或执行。

第二,用户的身份和角色。
同一个文件,对于不同用户来说,权限可能不同。Linux 通常会根据用户身份将访问者分为三类:文件所有者、所属用户组成员、其他用户。

二、Linux中的用户区分

在 Linux 中,用户大体可以分为两类:

root 用户:也叫超级用户,权限非常高,几乎可以操作系统中的任何文件和目录。
普通用户:只能在自己被允许的范围内操作文件、目录和命令。

创建用户:adduser [用户名]

设置密码:passwd [用户名]

删除账号:userdel -r [用户名]

切换用户: su [用户名]

切换到root用户:su

sudo 命令     # 以更高权限执行某条命令

超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。 

这里要注意:sudo 不是让普通用户真正变成 root,而是临时借用 root 的权限执行某条命令。并且不是所有普通用户都能随便使用 sudo,通常需要被加入系统信任配置中。

三、文件属性

使用ll命令查看文件信息,文件名前面的内容就是文件属性。

例如这就是code的文件属性:

1.文件类型

d:文件夹

-:普通文件

l:软链接(类似Windows的快捷方式)

b:块设备文件(例如硬盘、光驱等)

p:管道文件

c:字符设备文件(例如屏幕等串口设备)

s:套接口文件 

2.访问的身份

一个文件被创建出来以后,Linux 不会只问“你是谁”,还会看你相对于这个文件是什么身份。

Linux 文件权限里常见三种身份:

u:user,文件拥有者
g:group,文件所属组
o:others,其他用户

举个例子:
张三创建了一个 code.c 文件,那么张三就是这个文件的拥有者。张三所在的开发小组就是所属组。其他不属于这个组的人,就是 others。

所以权限并不是孤立存在的,而是和身份绑定在一起的。权限由用户身份和文件本身属性共同决定。

3.访问权限属性

Linux 最基本的权限有三种:

r:read,权限
w:write,权限
x:execute,执行权限

对普通文件来说:

r:能不能查看文件内容
w:能不能修改文件内容
x:能不能把它当作程序执行

对普通文件来说,r/w/x 分别表示读、写、执行;但对目录来说,含义会发生变化。目录的 r 表示能不能列出目录内容,w 表示能不能创建、删除、重命名目录中的文件,x 表示能不能进入目录、穿过目录、访问目录中的已知文件。

因此,目录的 x 权限非常关键。没有 x 权限,即使你有 r 权限,也只是能看到目录中有哪些名字,却无法真正进入目录或访问里面的文件。

四、文件访问权限的修改方法

1.修改权限属性

chmod

如果我们想修改文件或目录的权限,就会用到 chmod指令,下面是他的语法:

chmod 选项 权限 文件名

常用选项: -R 地柜修改目录及子目录的权限

u:拥有者
g:所属组
o:其他人
a:所有人


+:增加权限
-:删除权限
=:重新设置权限

使用演示:

chmod u+x test.sh     # 给拥有者增加执行权限
chmod g-w test.txt    # 去掉所属组的写权限
chmod o+r test.txt    # 给其他人增加读权限
chmod a-x test.sh     # 去掉所有人的执行权限

上面是符号方式,其实还有数字方式

权限也可以用数字表示:
r = 4
w = 2
x = 1


所以
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 = 6
r-- = 4
--- = 0

例如
chmod 755 test.sh

含义是
拥有者:7 = rwx
所属组:5 = r-x
其他人:5 = r-x

注意: 只有文件的拥有者或具有root权限才能修改和设置文件的权限属性。

2.修改文件角色归属

权限解决的是“能做什么”,而归属解决的是“这个文件属于谁”。

chown

chown 指令用来修改文件拥有者

chown 用户名 文件名

示例:

sudo chown user test.txt
表示把 test.txt 的拥有者改成 user。

chgrp

chgrp 指令用来修改文件所属组:

chgrp 用户名 文件名

示例:

sudo chgrp group test.txt
表示把 test.txt 的所属组改成 group。

如果想同时修改拥有者和所属组,可以这样:
sudo chown user:group test.txt

实际使用中,修改拥有者通常需要 root 权限,所以经常会配合 sudo 使用。

五、文件的默认权限和实际权限

在Linux下,一个普通文件,它的默认权限是 rw- rw- rw- (666);而一个目录的默认权限是 rwx rwx rwx (777)

但在我们实际创建一个文件后,权限通常不是默认值

注意,这就存在一种叫做 umask权限掩码 的机制,它控制的是新创建文件和目录时,哪些权限将被去除

umask

可以用umask指令查看当前umask码:

超级用户默认掩码值为0022,普通用户默认为0002

上面要是看不懂,可以看下面这个image 2 画的图,我觉得解释的很好,解释的就是上图。

umask也能修改:

umask 002

六、粘滞位

前面说过,目录的 w 权限表示可以在目录中创建、删除、重命名文件。

但是这会带来一个问题:如果一个共享目录权限是 777,那么所有用户都可以往里面创建文件,同时也可以删除别人创建的文件。

例如:

chmod 777 share

此时 share 目录对所有人都有读、写、执行权限。用户 A 在里面创建的文件,用户 B 也可能删除掉,因为删除文件主要看的是文件所在目录有没有写权限,而不是文件本身有没有写权限

为了解决这个问题,就可以给目录设置粘滞位

chmod +t share
设置粘滞位后查看目录权限:
ls -ld share

drwxrwxrwt

最后的 t 就表示该目录设置了粘滞位。

设置粘滞位后,目录中的文件通常只能由下面几类用户删除:

文件拥有者
目录拥有者
root 用户

权限 = 角色 + 文件的权限属性!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐