【Linux】权限解析(从chmod到umask和粘滞位)
目录
前言
一、权限是什么
二、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 用户
权限 = 角色 + 文件的权限属性!
