本篇文章主要讲解 Linux权限 的相关内容
1. Linux权限的概念
什么是权限?
权限就是通过一定的条件,拦住一部分人,给另一部分人权力来访问某一种资源。
例如:你是腾讯视频vip
,你就可以提前收看一些影视,但是如果你有LeetCode
会员,但是你想在LeetCode
上看视频,显然是不符合逻辑的,因此,权限还和事务的属性有关。
因此权限和人有关,也和事务的属性有关,即
权限 = 人("角色")+ 事务属性
。
Linux用户
Linux有两种用户:超级用户(root)、普通用户
- 超级用户:可以在Linux上做任何事情,不受限制;
- 普通用户:在Linux上做有限的事情;
- 超级用户的命令提示符是
"#"
,普通用户的命令提示符是"$"
。
可以采用命令: su [username]
进行用户的切换。例如:
- 从
root
用户切换成普通用户user
:su user
, - 从
user
切换至超级用户root
:su root
(root可省略)会提示你输入root password
但是如果我不想切换成root用户,仅仅用root的权限来执行一段命令该如何呢?
只需要输入:sudo [命令]
例如我要用root身份创建一个文件:sudo touch file.txt
,这时会提示你输入user password
。
2. Linux权限管理
文件访问者的分类(人)
Linux中有三种角色:
- 拥有者(user)
- 所属组(group)
- 其他(other)
文件类型和访问权限
文件属性权限一般分为三种:
- r(
read
) - w(
write
) - x(
excute
)
修改权限的做法
对于一个文件谁能修改它的权限呢?就两个
- 拥有者
- 超级用户
root
可以用命令 chmod
来修改权限 ,
- 给拥有者加权限:
chmod u+rwx [filename]
- 给拥有者减少权限:
chmod u-rwx [filename]
- 给所属组加权限:
chmod g+rwx [filename]
- 给所属组减少权限:
chmod g-rwx [filename]
- 给other加权限:
chmod o+rwx [filename]
- 给other减少权限:
chmod o-rwx [filename]
- 给所有角色加权限:
chmod a+rwx [filename]
- 给所有角色减少权限:
chmod a-rwx [filename]
注意这里的权限要加多少、减少多少都由自己控制。
也可以一条指令搞定:chmod u+-rwx,g+-rwx,o+-rwx,a+-rwx [filename]
权限有无的表现
假如我们给拥有者创建的文件的权限修改:
chmod u-r file1.txt
chmod u-w file1.txt
chmod u-x file1.txt
因此,对于普通用户自身也要受到对应权限的限制,即便这个文件是自己的,接下来看一下
root
。
我们首先把所有权限都取消:
然后用root
用户增加文件内容,查看文件内容:
可以发现
root
不受权限的限制。
权限的存在,保证普通用户的文件一般的安全性。
在上面的普通用户的例子中,虽然拥有者的权限全部都没了,但是所属组的权限还是在的,那为什么不会利用所属组的权限呢?实际上Linux对身份的识别只有一次,
- 如果识别到了,就用此身份进行访问,不会再继续识别;
- 如果为识别到,就用other。
证明对身份的识别只有一次
我们对一个文件修改它的普通用户身份,但是所属组不变,那原来的拥有者不是这个文件的拥有者,但是他还是属于所属组,如果是识别一次,那就会把原来的拥有者识别成属于所属组的,所以还是可以访问的:
权限修改的第二套做法
八进制表示法:
因此我们可以用指令 chmod [三三一组转换为对应八进制的值] [filename]
来修改权限,例如:
我们知道权限 = 角色 + 事务(文件)属性
我们刚才修改的是文件的属性,那是否能修改角色呢?即更改拥有者和所属组呢?肯定是可以的,但是修改拥有者和所属组是强制的,所以只能用root
用户来进行更改。
- 修改拥有者:
chown [新用户] [filename]
- 修改所属组:
chgrp [新组] [filename]
- 一起修改:
chown [新用户]:[新组] [filename]
3.文件的分类
我们知道文件权限的最头部的一个字符是代表文件的属性,那文件有哪几种呢?
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
好多文件都属于普通文件,例如:普通文件、文本文件、可执行程序、库等都叫做普通文件。
关于后缀
Linux系统不以后缀名来区分文件类型(注意不是Linux不需要后缀),并不代表Linux中的有些功能不需要,例如gcc,看这个例子:
所以一般情况下是可以用后缀的!
那这个可执行权限是啥呢?
可执行权限 vs 可执行
能执行是要求:本身就是可执行文件 + 角色有可执行权限
4. 关于目录文件
进入目录的权限
进入目录需要的权限是 x
可执行权限
我们知道r
是读取文件的内容信息,那么对于目录的内容信息是什么呢?
是此目录内所有文件的详情数据,因此r
是此目录内读取所有文件信息的权限。
我们知道w
是修改文件内容信息,因此w
权限决定用户是否能在目录内增加、删除、修改文件。
创建文件开始权限
对于普通文件起始权限是0666
,目录文件是0777
,那为什么创建出来之后是这个样子呢?
这个和umask
有关,umask对于某些系统可能不同
文件创建出来之后的初始权限其实是起始权限过滤掉umask
中出现的权限(这里的过滤不是简单的减法,其实是 起始权限 & (~umask)
例如
- 对于普通文件:
- 对于目录文件
关于目录文件中的删除
- 我们先利用普通用户的身份和root的身份创建价格文件:
- 然后用
root
的身份删除文件
- 再用普通用户身份删除
root
创建的文件
很明显删除成功了,这是为什么呢?
因为对于目录而言,能否删除目录中的文件和文件本身无关,和目录的属性有关,如果对于某个角色没有
w
权限,那么就无权取修改目录中文件的详情信息,例如:无法删除文件、增加文件。
- 那如果我们把普通用户对于目录的
w
权限取消掉,就无法删除了:
- 当然对于
root
来说还是没用的:
创建多人共享文件
那么如何创建多人共享文件呢?
首先肯定不能在各自的加目录下创建,因为对于路径./home
中创建的文件对于除了拥有者之外的所有人都无权限访问、修改、进入:
所以只能在非用户目录下创建,例如
root
账户创建了一个shared
目录,并给other
加上w
权限:
这时候任意用户都可以进入这个目录创建文件、修改文件,
- 创建文件
- 查看文件内容
- 甚至可以删除文件
但是我们只希望你可以添加文件,不可以删除不是你创建的文件,应该怎么做呢?
粘滞键
我们可以采用粘滞键的方法,给other加上粘滞键的权限:chmod +t shared
,这样就不允许别人删除你创建的文件了:
这样在这个粘滞键的目录中就不允许除了创建目录的人和root对文件进行修改甚至删除,只能进行查看:
- 用户一创建test.c文件,并进行追加数据:
- 用户二想在此文件中进行追加数据:
- 用户三想删除用户一创建的文件:
总结:
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员删除或者修改
二、该目录的所有者删除或者修改
三、该文件的所有者删除或者修改