一、Linux 权限的概念
Linux 下有两种用户:超级用户(root)、普通用户。
超级用户:可以在 Linux 系统下做任何事情,不受限制;
普通用户:在 Linux 下做有限的事情。
超级用户的命令提示符是 “#” ,普通用户的命令提示符是 “$”
命令:su [用户名]
功能:切换用户。
例如,要从 root 用户切换到普通用户 user,则使用 su user。 要从普通用户 user 切换到 root 用户则使用 su root(root可以省略),此时系统会提示输入 root 用户的密码,如下图:
二、Linux 权限管理
我们在使用 ll 指令的时候,通常会看到文件或目录名前面有一串的数据,那么它们是表示什么意思呢?例如下图红色框中:
首先我们知道,下面三列就是时间,准确来说是上一次修改文件或目录的时间:
然后就是下面这一列的数字,就是表示文件或目录的大小:
再下来我们了解两列 lmy 表示什么。
1. 文件访问者的分类
首先我们先要了解,文件访问者的分类分为三类:
- 文件和文件目录的所有者:u—User
- 文件和文件目录的所有者所在的组的用户:g—Group
- 其它用户:o—Others
而在我们下图中的两列 lmy中,第一列 lmy 表示的是 user,第二列表示 group,如下图:
而除了 user 和 group 之外,就是属于 other 组了,属于 other 组的用户没有权限访问这个文件或者目录。
2. 文件类型和访问权限(事物属性)
而最前面的那段字符,如下图:
这段字符表示什么意思呢,这段字符的含义如下:
而文件类型中的表示含义如下:
d:文件夹 -:普通文件 l:软链接(类似Windows的快捷方式) b:块设备文件(例如硬盘、光驱等) p:管道文件 c:字符设备文件(例如屏幕等串口设备) s:套接口文件
访问者权限的基本表示如下:
- 读(r):Read ,对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
- 写(w):Write ,对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
- 执行(x):execute,对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
- - 表示不具有该项权限
例如下图的 Test 目录中:
第1位的 d 就是表示这个文件类型为目录;2-4位为 user 所拥有的权限,分别为读写执行;5-7位为 group 所拥有的权限,也是读写执行;最后三位为 other 的权限,只有读和执行的权限,没有写的权限。
3. 文件访问权限的相关设置方法
命令:chmod
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
说明:只有文件的拥有者和 root 才可以改变文件的权限
修改权限字符:
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
例如我们 touch 一个文件,它的默认权限如下图:
我们给 user 加上 x 权限:
此时 test.c 的 user 用户就有了 x 权限;我们再给 other 用户加上 rwx 权限,如下图:
最后我们再将 group 组的权限全部去掉,如下图:
修改权限的操作就如上所示,其实我们还有另外一种修改权限的方式,就是使用二进制的方式;
例如 rwx 是三位字母,我们可以使用 0 或 1 表示其权限的有无;所以这三位我们可以看作整体,组成一个八进制的数字,来判断其用户权限的有无,例如 r-x,可以用二进制 101 表示,其八进制为 5;–x 可以用二进制 001 表示,其八进制为 1;rwx 可以用二进制 111 表示,其八进制为 7。
所以,在修改权限时,我们也可以使用三位8进制数字的方式修改,例如我们要将 other 的权限全部去掉,而 user 和 group 的权限全部加上,如下图:
再例如我们将所有组的权限都去掉,如图:
以上就是修改权限的相关内容。
三、默认权限
1. 对文件和目录进行操作需要的权限
在学习默认权限之前,我们需要了解我们对文件或目录进行操作需要的权限。
首先我们先了解一下进入一个目录需要什么样的权限呢?我们逐一尝试,首先我们先保留 读(r ) 权限:
读( r) 权限不能进入一个目录,然后我们分别只保留 写(w) 和 执行(x) 权限 :
我们可以观察到,进入一个目录是只需要 执行(x) 权限的。
然后我们将 dir 的权限放开,在里面新建一些文件,如下:
然后我们对 dir读(r )、写(w) 去掉,我们进入这个目录,然后发现查看和新建文件都不可以了,如图:
原因很简单,因为 dir 这个目录只有 执行(x) 权限,而 ll 指令查看文件属性是需要 读( r) 权限;而新建文件则需要 写(w) 权限,大家可以自己去实现验证一下。
所以总结一下:
- 是否允许一个指定用户查看目录的文件列表,需要 读( r) 权限。
- 是否允许一个指定用户在当前目录下新建文件或删除文件,需要 写(w) 权限。
- 进入一个目录需要 执行(x) 权限。
- 一个文件一定是属于一个目录的,一个文件能不能被查看,是由目录的权限决定的。
- 一个文件一定是属于一个目录的,一个文件能不能被删除,不是由这个文件本身决定的,是由所属目录与对应账户是否拥有 写(w) 权限决定的!
2. 文件和目录的默认权限
我们要知道,新建文件默认权限为 666 ;新建目录默认权限为 777;但是实际上,我们新建一个文件和目录观察,它们的默认权限并不是我们所说的,如下图:
如图我们可以观察到,新建的 test 目录默认权限为 776;新建的 test.c 文件默认权限为 664;原因就是创建文件或目录的时候还要受到 umask 权限掩码的影响。umask 功能:查看或修改文件掩码。
我们在命令行输入 umask 即可查看权限掩码,如下图:
修改权限掩码在 umask 后跟上权限掩码即可:
那么为什么会存在权限掩码呢?权限掩码是什么呢?它有什么用途呢?下面我们来分析一下。
假设我们不受权限掩码的限制,我们将权限掩码改成 000 ,然后创建一个目录,如图:
然后我们进入这个目录创建一个文件:
现在这个文件的默认权限 666,因为我们的权限掩码改成了 000;现在这个文件中,other 组是有 写(w) 的权限,所以就意味着所有人都可以对这个文件进行修改,这就使这个文件变得不安全;所以我们应该把这个文件中 other 组的 写(w) 权限去掉,如下图:
现在这个文件就变得安全了吗?不是!虽然在这个文件中,other 组没有了 写(w) 的权限,但我们前面讲过,一个文件能不能被删除,不是由这个文件本身决定的,是由所属目录与对应账户是否拥有 写(w) 权限决定的!我们要知道,这个目录对 other 组是放开所有权限的,因为权限掩码是 000,所以就意味着所有人都可以进入这个目录然后删除这个文件,意思就是你不让我看,我就毁掉!这意味着这整个目录都是不安全的!
所以我们回过头来看,为什么要有权限掩码,我们到现在应该可以猜到了,是为了保护目录和文件的安全,具体一点,就是不让 other 组对我们的目录和文件构成威胁。
那么权限掩码是怎么做到的呢?原因是,凡是在权限掩码中出现的权限,最终都要在起始权限中去掉。 例如下图:
所以权限掩码去掉了 other 组的 写(w) 权限,就有效地保护了目录以及目录内的文件安全。上图中的具体实现就是:最终权限 = 起始权限 & (~umask).
所以这就讲通了新建一个目录的实际默认权限为什么是 775;新建一个文件的实际默认权限为什么是 664 了。
3. 粘滞位
一般而言,我们上面所说的情况都不太会出现,因为不同的账号,是不会在同一个目录下的;但是如果有特殊情况,我们多个账号想互相协同,共享一些数据,但又不希望别人修改我们的数据呢?
这时候就需要我们用到粘滞位了,粘滞位的使用是 chmod +t 目录名
,粘滞位是只能给目录设置的,使用如下:
当一个目录被设置为粘滞位,则该目录下的文件只能由
- 超级管理员(root)删除
- 该目录的所有者删除
- 该文件的所有者删除