[Linux]权限

avatar
作者
筋斗云
阅读量:3

一、Linux下用户的分类

要知道权限,我们首先需要知道在Linux下用户的分类:

在linux中用户一般分为两类:

  • root:超级用户(基本不受权限的约束)

  • 普通用户:普通用户是受权限的约束的

超级用户:可以再linux系统下做任何事情,不受限制

普通用户:在linux下做有限的事情。

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

1.用户之间的切换

首先是这两个用户是如何切换的?

比如我们当前是一个普通用户

我们可以使用su指令,然后我们输入root的密码即可,这样我们就能成为root用户

这样切换以后,我们会发现,我们依旧处于原来的路径中,但是用户已经更改为了root账号了

我们从dream(我的用户名)变成了root,此时,我们依旧处于原来的路径中,但是用户已经更改为了root账号了

现在当我们想要退出来的时候,我们可以直接使用exit或者CTRL + D快捷键,这样我们就可以退出root用户了

除了直接使用su,我们还可以加上-,也就是使用 su -指令

不过我们可以注意到,当我们输入密码以后,它是一种以登录的方式进入进去的,所以会显示登录的一些信息,并且它的登录后当前的目录直接切换为home目录

su就像是一个直接的身份转变。直接将一个普通用户变成root,但并不是以重新登录的身份变化的,而是把一个人变成了root

同样的,对于su -以后的root,我们直接退出的话,会显示logout

当我们是root用户了,我们想要登录一个普通用户,我们也可以su加上指定用户名即可,这里不需要密码。当我们想退出的时候直接exit或者CTRL+D即可

同样,对于su -以后,我们直接退出的话,会显示logout

2.对一条指令的提权

当我们目前是普通用户的时候,我们知道,我们是不可以安装软件等操作的

因为安装软件其实就是将某些文件拷贝到系统的指定目录,而普通用户是没有权限进行拷贝的

所以我们可以使用sudo指令进行提权

sudo command

sudo后面加上你需要的操作,然后输入你的密码即可

不过在这里我们可能会觉得有些问题?那这样的话sudo只需要加上我当前账号的密码就可以了,那岂不是人人都是root,即便不知道root密码的情况下?

事实上却并非如此,你不信可以试试,你会发现sudo用不了。

那是因为,我们当前adduser新建出来的用户,没有办法执行sudo,因为系统不信任我们,除非未来将普通用户,添加到系统的信任白名单里面

如下图:

二、什么叫权限

1.权限

权限=角色+文件的属性

权限的最通俗的解释就是一件事情是否允许被我们做

  1. 权限认证的是身份(权限和“人”有关,这个人是有身份/角色的)

  2. 权限也和事物的“属性”有关(毕竟我们不可以将硬盘像面包一样啃一口

这里的属性,我们指的就是文件属性。

文件属性有三种:可读可写可执行

2.文件的属性

我们可以先创建一个目录和一个普通文件,然后使用ll命令显示如下

我们可以看到有很多列,最后一列是文件名,然后紧接着的三列是时间。这些很容易看出来

可是前面五列又代表了什么呢?这个,我们需要分开认识。

3.文件类型

首先是第一列我们进行分析一下

第一列的第一个字符是代表着文件的类型

文件类型:Linux系统中文件名后缀没有直接的意义(当然不代表它不用)

也就是说,Linux系统不以文件后缀作为文件类型,而是以这个第一个字符代表文件类型

下面是第一个字符所代表的文件种类

  • - :普通文件
  • d : 目录文件
  • b : 块设备文件
  • c :字符设备文件
  • p : 管道文件
  • ...

其实一般来说我们只需要用到目录文件和普通文件就行。

b是块设备文件,其实就是磁盘文件,c是字符设备文件,通常有键盘、显示器文件等,如下所示的都是字符设备文件,p是管道文件,一般用于通信

4.权限属性

如下所示,第一列的后九个字符代表的是权限的属性

  • r : 可读
  • w : 可写
  • x : 可执行
  • - : 对应位置没有权限

这些权限是跟角色的身份有关系的

而我们将这些人划分为三种角色、权限身份

  1. 拥有者
  2. 所属组
  3. other

对于我们下面的信息中,第三列就是拥有者,第四列就是所属组(分别是我框起来的两列)

而对于其他人,不是拥有者也不是所属组那就是other

第五列是文件的大小

对于第二列,我们暂时先不讨论

现在,我们先回过头来看第一列的后九个字符

他们三个三个为一组,分别对应拥有者,所属组和other的权限

而且对于每一个权限里面,三个的位置分别依次代表,是否可读,是否可写,是否可执行,就比如我划线:

  • 对于拥有者的权限是可读可写可执行

  • 对于所属组的权限是可读可写可执行

  • 对于其他人的权限是可读不可写可执行

需要注意的是root其实是不受权限约束的

举个例子:

首先,我们回到root用户,我们之前写了这个

现在我们是可以读取的

下面,我们将这个Hello.txt的权限给全关了

现在按照道理来说,应该不能访问了,但是我们是高贵的root用户,我们无视权限,照样访问。

三、更改权限

一般而言,更改权限的人只有两种,一个是拥有者,一个是root

在Linux中更改权限的指令是:

1. chmod 更改文件的属性

chmod指令可以进行权限的修改

功能:设置文件的访问权限 格式:chmod [参数] 权限 文件名

常用选项:

R -> 递归修改目录文件的权限 说明:只有文件的拥有者和root才可以改变文件的权限
chmod命令权限值的格式
用户表示符+/-=权限字符 +:向权限范围增加权限代号所表示的权限 -:向权限范围取消权限代号所表示的权限 =:向权限范围赋予权限代号所表示的权限 用户符号:   u:拥有者 g:拥有者同组用 o:其它用户 a:所有用户

实例:

# chmod u+w /home/abc.txt # chmod o-x /home/abc.txt
除了以上的指定修改,还有一种是利用比特位一一对应的方式来进行修改 ②三位8进制数字 示例:
# chmod 664 /home/abc.txt # chmod 640 /home/abc.txt

2. chown 更改拥有者

我们可以使用chown更改拥有者

但是当我们直接这样使用的时候,我们发现是不可以的

因为还需要考虑接受方是否想要。

所以在这里我们需要使用sudo来进行指令的提权或者直接用户root来执行。

chown 功能:修改文件的拥有者 格式chown [参数] 用户名 文件名 实例:
# chown user1 f1 # chown -R user1 filegroup1

3. chgrp更改所属组

既然拥有者都可以更改,那么所属组当然也是可以更改的了

不过还是一样的, 我们无法直接去更改所属组吗,即便我们本身就是所属组,但我们仍需要使用root去更改,或者如果是拥有者也是可以更改的

chgrp 功能:修改文件或目录的所属组 格式chgrp [参数] 用户组名 文件名 常用选项-R 递归修改文件或目录的所属组 实例
chgrp users /abc/f2
在使用chown的时候,如果我们在中间加上冒号,然后就可以一次性连续更改拥有者和所属组了

四、起始权限问题

当我们创建了一个新的文件的时候,我们发现它的起始权限是如下的

如果我们又创建了两个目录,它的起始权限是这样的

下面我们要介绍

umask

功能查看或修改文件掩码新建文件夹默认权限=0666 新建目录默认权限=0777 但是但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到 umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是:
mask & ~umask
格式umask 权限值说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用0002 这个0002就是一个八进制数,第一个0代表它是一个八进制数,后面的三位才是关键的。后面的三个八进制数刚好可以形成9个比特位

权限掩码:凡是在umask中出现的权限,不会在最终的文件权限中出现

所以最终,才有了本应该是666和777,但是最终确变为了664和775

最终权限 = 起始权限 & (~umask)

如果我们想要修改umask,我们直接它在后面添加八进制数字即可:

五、目录文件的读写执行权限

对于text.c文件它的读写执行,我们都很好理解,

可是对于dir1这个目录文件,它的读写执行就有点奇怪了,那么究竟都代表什么意思呢?

如果我们对这个目录文件的读权限给去掉了,那么我们可以看到,我们仍然可以进去这个文件,并且在这个目录文件中创建文件

所以读权限并不影响能否进入,但是如果我们想看目录的文件呢?

很抱歉,它不让我们看,所以读权限影响我们能否去看

如果我们继续将这个目录文件的x给去除掉,我们会发现,我们无法进入这个文件了

但是如果我们有r权限的话,我们可以去看它里面的内容

所以对于目录

r : 是否允许我们查看指定目录下的文件内容

w : 是否允许我们在当前目录下进行创建、更改、删除

x : 是否允许用户进入对应的目录

六、粘滞位

我们可以看一下我们的家目录里面的信息

可以看到,每一个用户它的拥有者和所属组都是它自己,并且只有拥有者有权限,其它的都没有权限

所以普通用户自己的家目录权限是700,我在我的家目录创建的文件,别人都看不到

但是有时候,我们多个用户想要进行文件数据的共享

所以就说明了我们所建立的共享文件,不能在任何一个人的家目录下

所以我们可以使用root账号在根目录下创建一个共享文件shared

这样大家就都能从这个目录共享文件了,但是因为大家都有权限,如果哪个用户急了,直接把这个目录

删了,这可不行为了避免被删除我们的文件,我们可以去关掉这个shared目录的写权限

可是这样做的话如果我们去掉了共享目录的w权限,我们也同时无法创建文件了,这就不是共享了!

为了使得让其他人无法删除文件,所以我们可以使用一个新的位,也即是粘滞位即直接o+t就可以了

这时候其他人就没办法删除这个目录了

当然root本身是可以删除这个目录的

所以粘滞位:给目录设置,一般是共享目录,大家可以在目录进行各自文件的增删查改,但是只允许文件的拥有者和root去删除文件,其他人一概不允许,t就是一种特殊的x权限

也就是说root用户是可以无视前面的一切规则的。在比如root自己的文件,即便我将我自己的权限都给关了,root照样想干啥干啥

不过如果每次我们想要共享文件的话,这样是不是有点太费劲了呢?

其实在linux中,根目录下就有一个文件tmp,他就是带了粘滞位的

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!