【Linux】权限问题

Linux权限

  • [一、Linux 权限的概念](#一、Linux 权限的概念)
  • [二、Linux 权限管理](#二、Linux 权限管理)
    • [1. 文件访问者的分类](#1. 文件访问者的分类)
    • [2. 文件类型和访问权限(事物属性)](#2. 文件类型和访问权限(事物属性))
    • [3. 文件访问权限的相关设置方法](#3. 文件访问权限的相关设置方法)
  • 三、默认权限
    • [1. 对文件和目录进行操作需要的权限](#1. 对文件和目录进行操作需要的权限)
    • [2. 文件和目录的默认权限](#2. 文件和目录的默认权限)
    • [3. 粘滞位](#3. 粘滞位)

一、Linux 权限的概念

Linux 下有两种用户:超级用户(root)、普通用户。

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

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

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

命令:su [用户名]

功能:切换用户。

例如,要从 root 用户切换到普通用户 user ,则使用 su user 。 要从普通用户 user 切换到 root 用户则使用 su root(root可以省略) ,此时系统会提示输入 root 用户的密码,如下图:

二、Linux 权限管理

我们在使用 ll 指令的时候,通常会看到文件或目录名前面有一串的数据,那么它们是表示什么意思呢?例如下图红色框中:

首先我们知道,下面三列就是时间,准确来说是上一次修改文件或目录的时间:

然后就是下面这一列的数字,就是表示文件或目录的大小:

再下来我们了解两列 lmy 表示什么。

1. 文件访问者的分类

首先我们先要了解,文件访问者的分类分为三类:

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

而在我们下图中的两列 lmy 中,第一列 lmy 表示的是 user ,第二列表示 group,如下图:

而除了 usergroup 之外,就是属于 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 是三位字母,我们可以使用 01 表示其权限的有无;所以这三位我们可以看作整体,组成一个八进制的数字,来判断其用户权限的有无,例如 r-x ,可以用二进制 101 表示,其八进制为 5--x 可以用二进制 001 表示,其八进制为 1rwx 可以用二进制 111 表示,其八进制为 7

所以,在修改权限时,我们也可以使用三位8进制数字 的方式修改,例如我们要将 other 的权限全部去掉,而 usergroup 的权限全部加上,如下图:

再例如我们将所有组的权限都去掉,如图:

以上就是修改权限的相关内容。

三、默认权限

1. 对文件和目录进行操作需要的权限

在学习默认权限之前,我们需要了解我们对文件或目录进行操作需要的权限。

首先我们先了解一下进入一个目录需要什么样的权限呢?我们逐一尝试,首先我们先保留 读(r ) 权限:

读( r) 权限不能进入一个目录,然后我们分别只保留 写(w)执行(x) 权限 :

我们可以观察到,进入一个目录是只需要 执行(x) 权限的。

然后我们将 dir 的权限放开,在里面新建一些文件,如下:

然后我们对 dir 读(r )、写(w) 去掉,我们进入这个目录,然后发现查看和新建文件都不可以了,如图:

原因很简单,因为 dir 这个目录只有 执行(x) 权限,而 ll 指令查看文件属性是需要 读( r) 权限;而新建文件则需要 写(w) 权限,大家可以自己去实现验证一下。

所以总结一下:

  1. 是否允许一个指定用户查看目录的文件列表,需要 读( r) 权限。
  2. 是否允许一个指定用户在当前目录下新建文件或删除文件,需要 写(w) 权限。
  3. 进入一个目录需要 执行(x) 权限。
  4. 一个文件一定是属于一个目录的,一个文件能不能被查看,是由目录的权限决定的。
  5. 一个文件一定是属于一个目录的,一个文件能不能被删除,不是由这个文件本身决定的,是由所属目录与对应账户是否拥有 写(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 目录名 ,粘滞位是只能给目录设置的,使用如下:

当一个目录被设置为粘滞位,则该目录下的文件只能由

  1. 超级管理员(root)删除
  2. 该目录的所有者删除
  3. 该文件的所有者删除
相关推荐
大哥_ZH3 分钟前
Linux umami在国产麒麟系统安装网站统计工具(只能上国内网站的系统)
linux·服务器
CT随17 分钟前
Redis内存碎片详解
java·开发语言
o(╥﹏╥)19 分钟前
在 Ubuntu 上安装 VS Code
linux·运维·vscode·ubuntu·vs
anlog26 分钟前
C#在自定义事件里传递数据
开发语言·c#·自定义事件
奶香臭豆腐39 分钟前
C++ —— 模板类具体化
开发语言·c++·学习
AI慧聚堂43 分钟前
自动化 + 人工智能:投标行业的未来是什么样的?
运维·人工智能·自动化
不爱学英文的码字机器1 小时前
[Linux] Shell 命令及运行原理
linux·运维·服务器
晚夜微雨问海棠呀1 小时前
长沙景区数据分析项目实现
开发语言·python·信息可视化
graceyun1 小时前
C语言初阶习题【9】数9的个数
c语言·开发语言
cdut_suye1 小时前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python