linux之权限

Linux权限的概念

权限就是:一件事情是否允许被谁“做”
权限=人+事物属性

Linux下有两种用户(人):超级用户(root)、普通用户。
超级用户:可以再linux系统下做任何事情,不受限制,且root用户只有一个。
普通用户:在linux下做有限的事情。普通用户可以有多个
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”

那这里所说的事物通常在Linux指的就是文件,当然不仅仅指文件,现阶段我们主要先来谈文件,那事物属性当然就对应到文件的属性了。
那在Linux中,文件可以拥有的属性有:可读、可写、可执行。

 Linux权限管理

Linux用户分类及切换

用户分类

那Linux用户的分类其实我们上面已经提过了,分为root用户和普通用户

超级用户root:可以在linux系统下做任何事情,几乎不受限制。root用户只有一个。
普通用户:在linux下做有限的事情,普通用户可以有多个。

普通用户—>root 

现在以普通用户的身份登录:

那我现在想切换到root,怎么做呢?

指令:su 或者 su root (root可以省略)

输入root的密码,成功切换到root:

 如果我们想退出登录可是敲ctrl+d或者exit就可以退出刚才的登录,又回到普通用户。

观察,我在普通用户的家目录zzy下使用su指令切换为root账号,root此时还在zzy家目录下:

su是单纯的账号切换 ,用户所处的路径不发生改变。

 指令: su - 或者 su - root  (root可以省略)

 

可以看到su - 比su 多显示了登录时间,且所处的路径发生了变化,变成了root的家目录/root。

su -其实是重新登录root,登录后默认所在路径在家目录下。 

 root—>普通用户

指令: su user

 

root切换到普通用户不需要输入密码直接可以切换 

 普通用户切换到普通用户需要输入密码

单条指令的提权

比如,我现在是普通用户:

我想查看root家目录下的文件,但没有权限, 如果不切换成root账号, 该怎么做呢?

指令: sudo 

原指令不变,只需在前面加上sudo就行了,这就是对单条指令进行提权:     

根据提示,现在需要输我自己的密码。但是输了自己的密码之后,我们还用不了sudo这个命令, 因为我们的用户不在白名单里, sudo提权只需要输入自己的密码即可,所以需要有一个白名单.

用户角色划分/文件访问者的分类(人)

Linux中还对用户角色进行了划分,或者说对文件访问者的一个分类:

文件和文件目录的所有者:u---User
文件和文件目录的所有者所在的组的用户:g---Group(
其它用户:o---Others 

图中的第三列其实就对应文件的拥有者,第四列就对应文件的所属组, Linux其实不不记录other,other可能有很多个,除了拥有者和所属组之外的都是other。

关于文件所属组

 文件所属组,这个概念该怎么理解呢?为什么要有文件所属组呢?

假设现在有一个公司,只有一台Linux机器,所有人都在这台机器上开发, 且不同的工作小组在做同一件工作。
那假设现在有两个小组A组和B组,它们在开发同一款产品,现在有两个人,张三在A 组,李四在B组。公司在Linux上创建了两个目录,A_code,B_code,分别让A,B两组存放自己的代码。张三写好了一份代码test.c,张三的组长跟张三说,把你的代码给我看看,我看你写的怎么样。
那我们假设此时Linux中没有所属组的概念,只有文件的拥有者和other。然后张三组长就去访问张三写的test.c,但是由于张三才是test.c的拥有者,A组长是other,所以看不了, 组长没有权限查看张三的test.c文件。所以张三现在给test.c文件开放other的权限,组长就可以看了。但是此时不仅A组长可以看了,B组的李四包括其它人也是other,所以B组的人也可以看了。那这里就涉及到了权限安全的问题。我只是想让我的组长看,但是现在其它组的人也可以看,那这不合理。所以,Linux就顺理成章的引入了所属组的概念。

那有了所属组之后,张三就可以把自己的代码只开组内的权限,这样跟张三一组的人就都可以看了,但是其它组还是other,没有权限,就查看不了。

文件类型和访问权限(事物属性)

文件类型

首先右边几列分别代表:

那第一列的这个字符其实表示的是文件类型

那我们就要知道: Linux不用文件后缀区分文件类型,而是用文件属性中第一列的第一个字符来标识文件类型。 

Linux中的文件都有哪些类型呢?那也就对应了第一个字符有哪几种呢?

 -:普通文件(指不包含有文件系统信息的结构信息的文件,是用户所接触到的文件,比如常见的.exe,.c,.txt,归档文件等在Linux中统称为普通文件)
d:目录(文件夹)
(ps:前两个是最常见的)


l:软链接(类似Windows的快捷方式)文件
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接字文件

文件后缀 

那认识了文件类型之后,我们来思考一个问题,上面说了Linux不以文件后缀区分文件类型,那今后我们在Linux中该如何去看待文件后缀这个东西呢?

今后我们自己创建文件的时候照样可以加对应的后缀,想用就用,因为这个是给我们自己看的,给人看的。在Linux中我们可以将后缀看成文件名的一部分。

但是:

现在在我当前这个目录下有一个.c文件,里面有一段C语言代码, 并且它编译生成的可执行文件也是可以正常运行的: 

Linux不用文件后缀区分文件类型,那我就可以这样做: 

a.out改名,改成a.txt,那它不会改变类型,还是可执行文件,还可以正常执行.

现在把test.c 改成test.txt,里面还是这段代码,然后那我们再用gcc编译它: 

 看到报错说文件格式不能被识别。

不是说Linux不以文件名区分文件类型嘛,那这里为啥一改后缀就不行了呢? 

我们上面说的是Linux不以文件后缀区分文件类型,那这里的Linux指的是操作系统,也就是说操作系统不以文件后缀区分文件类型。
但是我们刚才的指令是gcc test.txt
Linux操作系统不以文件后缀区分类型(Windows是以文件后缀区分类型的),并不代表gcc(Linux中的C编译器)或者其它的一些软件不以文件后缀区分文件类型啊。

基本权限

基本权限
i.(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
ii.(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
iii.执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
iv.“”表示不具有该项权限 

 

以test.txt为例,怎么去描述它的权限呢?我们上面说了,权限等于人+事物属性

对于它的拥有者来说,权限是rw-,即可读可写,所属组的权限是可读r--,other的权限也是可读r--。另外,它的拥有者是zzy这个用户,所属组也是zzy。
所以zzy就是拥有者和所属组,那其它的用户就是other。
 

所以我们描述一个文件的权限的时候,一定是描述它的拥有者、所属组、other分别有什么权限,它的拥有者和所属组都是谁。(即人+事物属性)
这才是对一个文件权限的一个完整描述。

了解了文件的访问权限,如何去修改的权限呢?

那我们说了权限=人+事物属性。
那对应Linux中就是用户+文件属性。
所以,我们要修改权限,那要么修改用户,要么修改文件属性。

先从文件的属性下手:

以test.txt为例,我当前登录的用户就是该文件的拥有者,所以我是可以修改文件的权限的,一般来说只有文件的拥有者和root才可以修改文件的权限。 

指令:  chmod [参数] 权限 文件名

功能:设置文件的访问权限 

常用选项:
-R : 递归修改目录文件的权限,即对当前目录下的所有文件与子目录进行相同的权限变更.
说明:只有文件的拥有者和root才可以改变文件的权限 

命令权限值的格式: 

用户表示符+/-=权限字符:
        +:向权限范围增加权限代号所表示的权限
        -:向权限范围取消权限代号所表示的权限
        =:向权限范围赋予权限代号所表示的权限

用户符号: 
        u:拥有者
        g:拥有者同组用
        o:其它用户
        a:所有用户

 用-将文件权限删除:

 可以一次操作多个角色

用+添加文件权限:

也可以一个操作单个角色

 用=赋予文件权限:


文件权限值的表示方法 

上面我们讲到文件的三种权限读、写、执行的表示可以用三个字符r\w\x表示,那这种表示方法我们把它叫做字符表示法:

除此之外呢,其实还有另外一种表示方法——8进制数值表示法: 

给test.txt去掉所有权限:

添加所有权限:
 

添加部分权限: 


文件的权限 

可以看到既不能查看文件内容也不能修改文件内容, zzy虽然是拥有者,但我没有任何权限。 

 

权限可以约束普通用户,但不能约束root


 目录的权限

可执行权限x

如果目录没有可执行权限(x),则无法cd到目录中: 

可读权限r

 我们发现去掉r后,不能ls查看目录内容了,但依然可以创建文件.

可写权限w 

发现不能在目录中创建文件和删除文件了。


更改文件拥有者和所属组

指令:chown [参数] 用户名 文件名

功能:修改文件的拥有者 

-R : 处理指定目录以及其子目录下的所有文件 

发现zzy虽然是这个文件的拥有者,但不能修改拥有者。

强制转让的话,谁有这个能力? 当然是root:

可以用sudo的话用sudo也可以,不用切换,直接单条指令提权。

更改文件所属组也是相似的: 

功能:修改文件或目录的所属组

格式:chgrp [参数] 用户组名 文件名

常用选项:-R 递归修改文件或目录的所属组

如果想同时更改拥有者和所属组呢?

总结: 

可执行权限x: 如果目录没有可执行权限, 则无法cd到目录中
可读权限r: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容
可写权限w: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件

一个文件一定是属于一个目录的,一个文件属性能不能被查看是由目录的r权限决定的,一个文件能不能被删除和能不能新建文件,是由目录的w权限决定的,能不能进入目录是由x权限决定的.


关于默认权限 

新建一个文件和文件夹:

发现新建出来文件的默认权限是664目录的默认权限是775 

这里664和775只是在我当前所用的机器上(我用的是云服务器,centos7.6)是这个结果,可能在不同的操作系统上这个默认权限是不一样的。 

权限掩码——umask 

 为什么默认权限是这个值呢?这和权限掩码有关:

先引入起始权限的概念,起始权限是系统设定的, 普通文件的起始权限是666(rw-),目录文件的起始权限是777(rwx).

那我们创建出来文件所看到的默认权限是怎么得到的呢?

Linux系统为了更好的控制权限,会提供一个默认的权限掩码,我们称之为umask

在Linux中,系统默认是有自己的一个权限掩码的,通过umaks这条指令既可以获取这个权限掩码:

 

那这个权限掩码我们可以认为是一个8进制数字(以0开头)。
那八进制002转换为二进制就是000 000 010
而我们的起始权限也是一个八进制数字嘛,这样它们正好可以一一对应。 

我们现在知道普通文件的起始权限是666,二进制就是110 110 110 权限掩码是是000 000 010
权限掩码是怎么起作用的呢?

文字表述: 取消权限掩码二进制位为1所对应的权限,如果原权限为0,那么权限仍保持为0.
用公式表达: 默认权限(最终权限) = 起始权限 & (~umask) 

对于普通文件来说,我们上面看到默认权限是664。
那普通文件的起始权限是666—>110 110 110
权限掩码000 000 010,~(按位取反)之后是111 111 101
两者进行&结果是:110 110 100 (664)

对于目录, 目录默认权限是775—>111 111 110
目录起始权限是777—>111 111 111
权限掩码取反是111 111 101

起始权限 & (~umask)结果是: 111 111 101 (775)

 修改权限掩码

权限掩码是可以修改的,如果把权限掩码改成0007:

权限掩码0007—>000 000 111
取反为:111 111 000
文件的起始权限666—>110 110 110
此时普通文件的默认权限:起始权限 & (~umask)为
110 110 000—>660 (rw-rw----)
目录的起始权限为777—>111 111 111
此时目录的默认权限为:
111 111 000—>770 (rwxrwx---)

符合计算的结果

 粘滞位

我们在使用Linux的时候呢,有时候就可能需要一些共享目录,多个用户在同一目录下进行操作, 即目录被所有普通用户共享,用来保存普通用户产生的临时数据。

我们知道所有普通用户的家目录都是在home目录下的,那这个home目录其实是属于root的。


创建的所有普通用户,它们的家目录都是在home下面的:

那这里的zzy就是我的家目录,我未来创建的所有文件都是在我的家目录里面的,而且只有我对我的家目录是有rwx权限的,其它的任何一个普通用户对我的家目录都是没有任何权限的。
那假设现在我家目录里面有一份数据,那现在testuser这个用户也想来看一下这份数据。
那是不可能的,testuser这个用户没有权限,因为他是other,根本无法进入我的目录,更别谈看我家目录里面的文件了。
但是我们可能有这样的需求,就是让多个用户去交互它们的数据。我们就可能需要一些共享目录,把需要共享的数据放在共享目录下,所有的用户就都可以查看了。那在Linux中,这个共享目录一般是由root提供的,只要root把权限放开,那其他普通用户就可以以other的身份去访问这个目录了。

 

此时我就创建好了一个公共目录public。
我们看到它的一个默认权限是755,这和root下的umask肯定是有关系的。
 

既然要创建的是公共目录,就把它所有的权限都放开: 

在这个共享目录里面,不同的用户也就可以实现数据的共享了: 

 

因为testuser对test1.txt文件对other开放了r权限, zzy用户可以查看test1.txt文件 

但他并没有对other 开放w权限,所以我们即使处在共享目录下,也还是会受到权限的约束,这也很正常,因为我和ymm都是普通用户。


假如出现这样的情况:

testuser用户把test1.txt的所属组和other的权限全部关闭,不让其他用户看和写. 

既然你不让我看,也不让我写, 那我可以删除文件吗?

可以看到是可以把文件直接删除掉的, 因为这是共享目录, other对该目录有w权限, 而所有用户的文件都放在这个目录下。即使我看不了也写不了别人的文件,但是我可以把它删除掉。 

 所以,在共享目录里面,文件被所有用户共享的时候,会受到权限约束,但是拦不住别人删你的文件, 显然这是不合理的.

那为了解决这个问题,Linux就引入了粘滞位的概念。(因此我们也应该知道,粘滞位只能给目录添加

指令: chmod +t 目录名

添加粘滞位也需要root,或者使用sudo:

 最后一位由x变成了t,而t就表示该目录被添加上了粘滞位。

再想删除其他用户的文件就不行了: 

 

当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由:

一、超级管理员删除
二、该目录的所有者删除(一般是root)
三、该文件的所有者删除 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值