当前位置: 首页 > news >正文

Linux权限【超详细】


📙 作者简介 :RO-BERRY
📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持


在这里插入图片描述


目录

  • 扩展知识:shell命令以及运行原理
  • 1.Linux权限的概念
  • 2.Linux权限管理
    • 1.文件访问者的分类(人)
    • 2.文件类型和访问权限(事物属性)
      • 2.1文件类型
      • 2.2文件权限属性一共有十个字符(包括-)
      • 2.3.文件权限值的表示方法
      • 2.4 文件访问权限的相关设置方法
        • 1.指令chmod
        • 2.指令chown</font>
        • 3.指令chgrp</font>
  • 3.目录权限
    • 总结:
  • 4.umask
  • 5.file指令:
  • 6.粘滞位
  • 7.关于权限的总结


扩展知识:shell命令以及运行原理

🍁Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。
通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从原理上来说:

Shell是Linux操作系统中的外壳程序,它扮演着“用户和Linux内核之间的桥梁”的角色。具体而言,Shell将用户输入的命令解析并传递给Linux内核处理,同时将Linux内核的处理结果翻译并返回给用户。因此,通过Shell,用户能够更加高效、安全、低成本地使用Linux内核。(我的理解是相当于操作系统的系统调用的功能)

从技术角度上来说:

Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
1.将使用者的命令翻译给核心(kernel)处理。
2.同时,将核心的处理结果翻译给使用者。

对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。

帮助理解:如果说你是一个闷骚且害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的且有让你心动的MM小花。你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。


1.Linux权限的概念

🎄Linux下有两种用户:

超级用户(root)普通用户
超级用户:可以再linux系统下做任何事情,不受限制
普通用户:在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
在这里插入图片描述

命令:su [用户名]
功能:切换用户。

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

我们没有普通用户,我们进行创建一个
在这里插入图片描述
Linux中root用户只允许存在一个,非root用户可以存在很多个
我们先使用这个普通用户登录
我们如果是普通用户如何转换成root用户使用

普通用户切换至root用户
1、按上su,然后按照提示输入相应的root密码,就可登录到root权限下。
2、按上sudo su,然后按照提示输入相应的root密码,就可登录到root权限下(这个命令下,一般不需要输入相应的root密码)。
3、按上su root,然后按照提示输入相应的root密码,就可登录到root权限下

root用户切回普通用户
1、只需执行命令:su user (user是你自己安装时候的用户名),
2、直接输入exit
3、Ctrl+D组合键退出
如何给root用户设定密码:
只需执行命令:sudo passwd root然后根据提示一步一步来。

这里我们使用的是su -,作用是能从普通用户权限变为root用户,但是需要输入root用户的密码
在这里插入图片描述
我们如果是root用户如何转换成普通用户使用
我们这里使用热键【Ctrl+D】
在这里插入图片描述
普通用户切换成root,需要输入root的密码 —>拥有root密码的人一般都是系统的管理员
root账号变成普通,不用认证的
普通用户变成另一个普通用户需要对方的密码

🐥为了让我们对权限的概念更加清晰我们来学习一个新指令—>sudo

sudo
对指定的指令进行提权

我不想把我自己变成root,但是我还想让普通用户以root的权限执行一条命令怎么做呢?
在你的指令前面无脑加sudo就可以

在这里插入图片描述
但是我们在执行sudo命令时出现了如下提示:
xx is not in the sudoers file. This incident will be reported.
这句话的意思是我们的用户不在我们的sudoers的文件里
原因分析:一般这种情况是创建了新用户,没有对应修改sudoers文件或者group文件。

我们可以看看这个文件,这是Linux系统里面的用户的配置文件
在这里插入图片描述
这个文件相当于我们Linux里的一个白名单,如果一个用户的用户名在这个配置文件中,才允许这个用户执行sudo

如果一个用户的用户名不在这个配置文件中,不允许这个用户执行sudo
我们需要以root的身份将用户添加进去才能使用sudo
这个白名单只有管理员将值得信任的用户添加进去,是为了管理服务器的安全性,因为sudo命令可以让普通用户使用root用户的权限。

在这里我们先不讲解如何进行处理,处理内容我们会在以后涉及到。我们先来看其他人成功的例子
在这里插入图片描述
我们使用了一次输入密码后,第二次第三次就不用输入密码了


2.Linux权限管理

🐥我们先来弄清楚几个概念

1、权限一定是用来限制人的“能还是不能”
我们在爱奇艺里普通用户和vip用户的权限是不一样的
2、对应的操作对象一定要有对应的满足人的需求的属性
比如我们想在爱奇艺里刷题—>他没有这个功能

这就对应了我们Linux里

1、文件访问者的分类(限制人)
2、文件类型和访问权限(文件权限)—r w x


1.文件访问者的分类(人)

Linux限制人更多的限制的是人的角色身份

比如说张三是一个学校校长,校长办公室只有他能进入,而这个权利不是因为他是张三,而是因为他是校长,因为他这个身份角色

这里我们的Linux将用户分为三个角色

  • 所有者—文件和文件目录的所有者:u—User(中国平民 法律问题)
  • 所属组—文件和文件目录的所有者所在的组的用户:g—Group(不多说)
  • other—其它用户:o—Others (外国人)

我们先变成普通用户查看一下文件

在这里插入图片描述
那么在这里对应的只要不是拥有者不是所属组就是对应的other

好了,拥有者好理解,这个文件被谁创造就被谁拥有嘛,other也好理解,除了创作者谁都是other
那我们Linux为什么要存在一个所属组呢?这个是干嘛的?🤨

  • 首先Linux是允许我们建立各种各样的组的,可以独立建立一个组,也可以很多人,以某个名字做组名
  • 然后我们使用所属组的意义就在于我们创建的文件可以让多人看到,如果没有所属组的存在,那么除了所有者,其他所有人都是other,那么别人想看到你写的代码的时候都无法访问,还有一点就是,这个所属组适合于分小组开发,也利于管理

接下来我们来学习一下文件权限属性


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

在这里插入图片描述

2.1文件类型

在win下,有文件类型,通常使用后缀标识
Linux的文件类型不通过后缀区分(不代表Linux不用后缀)
在Linux文件中 第一个字符表示我们的文件类型

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

2.2文件权限属性一共有十个字符(包括-)

在这里插入图片描述

2.3.文件权限值的表示方法

  • 字符表示方法
    在这里插入图片描述
  • 8进制数值表示方法
    在这里插入图片描述

2.4 文件访问权限的相关设置方法

1.指令chmod

功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项
R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限


chmod第一种用法:用户表示符+/-=权限字符

+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户

🎄我们来引入第一批操作:
我们了解了权限之后我们如何来修改权限?
在这里如果修改一个文件的权限,一般得是文件的拥有者,也就是说文件是你的,你才有权限去改

我们将user简称为u,将group简称为g,将other简称为o

在这里插入图片描述
在这里插入图片描述

我们还可以一次性编辑两个权限
在这里插入图片描述
我们还可以一次性编辑所有用户的权限
在这里插入图片描述
我们想去掉所有人的所有权限
在这里插入图片描述
这样所有人的权限都没有了
那我们想给所有人的权限加上r
我们可以使用a-all代表全部
在这里插入图片描述

我们接下来进行一下验证
在这里插入图片描述
我们对文件进行写操作,这里表示我们没有写的权限
在这里插入图片描述
我们修改一下权限就又可以正常运行了
在这里插入图片描述
对于x属性—是否可执行,当我们有了可执行的权限了之后还要看我们的文件是否可执行
这里有一个细节

就如同我们上面的拥有者以及所属组两个的名称都是一个人的时候,这个文件的拥有者没有可执行权限,但是所属组有可执行权限啊,因为我既是拥有者也是所属组啊
但是在这里,如果我们的拥有者没有可执行权限的时候,我们的所属组以及other都无法执行,就算有可执行权限也不可执行。

这个原因是因为当我们一个用户去执行这个文件的时候,不是先看你对这个文件是否有可执行权限,而是判断你是否是这个文件的拥有者,所有它只会看一个一个按照你的名称去对比,它第一次对比你是拥有者,他就会以拥有者的权限对你能否运行此文件做判断

回到正题:我们切换成root权限发现,我们既能读文件也能写文件,这说明了权限在root下形同虚设
现在才发现权限只是限制普通用户的
在这里插入图片描述


chmod第二种用法:三位8进制数字

我们的权限为rwx这三个
那我们能不能以111来代表这个呢?
1代表有0代表无
rwx–>111–>代表的二进制为7
-wx—>011–>代表的二进制为3
那么我们可以这样设置文件:
我们使用777让所有人都有了rwx权限
在这里插入图片描述
我们使用000让所有人都没有了rwx权限

在这里插入图片描述


2.指令chown

功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
非root用户需要sudo提升权限操作,或者有root密码切换成root权限
在这里插入图片描述


3.指令chgrp

功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
非root用户需要sudo提升权限操作,或者有root密码切换成root权限
在这里插入图片描述


3.目录权限

对一个目录而言,如果进入一个目录,需要什么权限?
权限对于root用户是没有影响的,我们换到普通用户
我们一个权限一个权限进行尝试


首先,我们进入到自己的目录,权限全开的情况下是可以进的
在这里插入图片描述

我们先去掉读权限
在这里插入图片描述

我们依然可以进目录,我们再单独去掉写权限
在这里插入图片描述

我们还是可以进入目录,我们再单独去掉可执行权限
在这里插入图片描述
这个时候我们发现没办法进入我们的目录了
这说明,我们要进入一个目录我们需要的是x权限

那对于目录来说我们的读权限和写权限分别对应什么呢?
我们在这个目录里创建一个文件
权限全开的情况下,我们创建文件还是可以的
在这里插入图片描述

我们去掉读权限
在这里插入图片描述
我们无法看到目录里文件的信息了
所以我们对目录没有读权限我们就无法查看目录文件信息
可以进行创建文件,但是无法查看信息
在这里插入图片描述
我们去掉写权限
在这里插入图片描述
去掉写权限后,我们无法创建文件,但是可以打印目录文件信息

总结:

对于目录文件:
读权限—r—是否可以进行查看目录文件信息
写权限—w—是否可以在目录里新建文件和删除文件
可执行权限—x—是否可以进入目录
在这里对于root用户就算所有权限都没有,它依然可以进行所有操作,root不受权限控制


4.umask

功能:

查看或修改文件掩码
新建文件夹默认权限=0666
新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask

格式:

umask 权限值

说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。

在这里插入图片描述

-rw-rw-r-- 1 cmj cmj 0 Feb 3 12:04 test.aa
drwxrwxr-x 2 cmj cmj 4096 Feb 3 12:04 test.ee
为什么我们创建的普通文本文件:默认的权限不是777,而是664
为什么我们创建的目录文件:默认的权限不是777,而是775

首先,我们的Linux系统中可执行程序占比不高,只有一些必须可执行的程序才会给它加上可执行权限,一般的文件系统不会默认去加,而是由用户去自主决定添加,像我们的目录以及可执行程序必须给它加的会给它加上可执行权限,一般的文件可以不加,让用户自主添加。
所以:
对目录而言,它的起始权限以777开始==
对普通文件来说起始权限以666开始

那么这样说我们创建的时候普通文件不是666而是664,目录为775,这是为什么呢?

这是因为umask—>权限掩码
它是可以让用户自主定制文件创建的时候的默认权限

我们打印umask
在这里插入图片描述
会出现四个字符,我们只关心后面三个字符就可以了。
八进制002对应的就是000 000 010
这就我们的权限掩码
其含义是:
从起始权限中去掉在umask中出现的权限

例:
我们普通文件起始权限为
666—>110 110 110
002—>000 000 010
我们要去掉这个存在的1
变成了110 110 100—>664

注意:我们在这里不是使用的减法,而是去掉权限掩码
释义:起始权限这一位为0,权限掩码为1的时候,我们就可以不管这一位
—>起始权限后三位001 AND (umask)010不变就行
只有原起始权限这一位有1的时候,相对应掩码这一位也是1我们就可以去掉
用计算机语言来说就是 起始权限&(按位与)(-umask)=最终权限(默认)

同理我们的目录的其实权限可以自行计算一下
算出来也是775


接下来我们如何定制权限掩码呢:

我们设置为003(原002)
在这里插入图片描述
我们创建一个文件一个目录
在这里插入图片描述
在这里插入图片描述
003—>000 000 011
new1.txt—>-rw-rw-r–(664)—>110 110 100
new2—>drwxrwxr–(774)—>111 111 100
使用按位与操作
文件:110 110 110—>110 110 100(664)
目录: 111 111 111—>111 111 100(774)
可以看到我们与上面的默认权限是一样的


5.file指令:

功能说明:辨识文件类型。
语法:file [选项] 文件或目录…
常用选项

-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试去解读压缩文件的内容

我们想查看文件更详细的数据,可以使用file指令
在这里插入图片描述


6.粘滞位

当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除

首先我们要清楚:

一个文件能不能被删除并不取决于文件的权限,而在于这个文件所在目录的权限

Linux的home目录里存放的是每一个用户对应的文件,默认权限设置的是700,只有本用户能访问进去(root用户除外)
在这里插入图片描述

这样的话其中一个用户想展现给另一个用户看一个文件,但是没有权限
Linux为了实现让多个用户之间可以实现数据共享,在根目录会有一个tmp目录是可以所有用户都进去访问,rwx的权限都是全部开启的
在这里插入图片描述

但是删除一个文件和你这个文件的权限无关,这个目录下的每一个人都具有权限删除创造文件,所以你的文件放在这里也能被其他用户给删除掉,别人一个不小心删除了你宝贵的文件,有可能会导致你从头再来
这个时候我们就引出一个可以给other加上一个权限t
我们在tmp目录下创建一个test.txt文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到我们的test.txt文件的文件权限最后面紧跟了一个T,这是原x的位置,现在变成了T
这样其他用户就会没有权限删除你的这个文件

上面这个T称为我们的粘滞位:给目录中的other设置的一个权限位,具有x的意义,同时也进一步对目录权限进行特殊限定:

将T加在目录的权限上,该目录的文件只有root或者拥有者有权利进行删除,其他人一概不允许


7.关于权限的总结

  • 目录的可执行权限是表示你可否在目录下执行命令。
  • 如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
  • 而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限
  • 所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档

相关文章:

  • React实例之完善布局菜单(二)
  • 轻松使用python将PDF转换为图片(成功)
  • 探秘Java 8 Lambda:简洁高效的集合操作
  • STM32--HAL库定时器学习记录(易懂)--持续学习
  • 【安装指南】nodejs下载、安装与配置详细教程
  • 3D人体运动重建
  • Python循环语句——while循环的基础应用
  • 【已解决】Oracle 12541 TNS 无监听程序
  • NAS系统折腾记 – Emby搭建家庭多媒体服务器
  • SOME/IP SD 协议介绍(五)使用SOME/IP-SD宣布非SOME/IP协议的协议。
  • 深入Spring MVC的工作流程
  • 【OpenCV人脸检测】写了个智能锁屏小工具!人离开电脑自动锁屏
  • ElementUI组件:Link 文字链接
  • 2.4作业
  • Makefile学习
  • 2017 年终总结 —— 在路上
  • conda常用的命令
  • Facebook AccountKit 接入的坑点
  • iOS 颜色设置看我就够了
  • nginx 配置多 域名 + 多 https
  • Python 反序列化安全问题(二)
  • Python实现BT种子转化为磁力链接【实战】
  • Spark学习笔记之相关记录
  • vue-router的history模式发布配置
  • windows下mongoDB的环境配置
  • 携程小程序初体验
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • $L^p$ 调和函数恒为零
  • (13):Silverlight 2 数据与通信之WebRequest
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (算法)求1到1亿间的质数或素数
  • (转)socket Aio demo
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET gRPC 和RESTful简单对比
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .net中我喜欢的两种验证码
  • [ 第一章] JavaScript 简史
  • [ 蓝桥杯Web真题 ]-布局切换
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [Android Pro] Notification的使用
  • [Android]使用Git将项目提交到GitHub
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [C++]打开新世界的大门之C++入门
  • [CDOJ 1343] 卿学姐失恋了
  • [FTP]pureftp部署和优化
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [HTML]Web前端开发技术6(HTML5、CSS3、JavaScript )DIV与SPAN,盒模型,Overflow——喵喵画网页
  • [IDF]被改错的密码
  • [LeetCode]284. Peeking Iterator(C++,类,暴力)
  • [Linux] CE知识随笔含Ansible、防火墙、VIM、其他服务
  • [Linux]----文件操作(复习C语言+文件描述符)
  • [Machine Learning][Part 7]神经网络的基本组成结构