【Linux】shell命令与Linux权限的概念

目录

  • 一、shell命令
  • 二、Linux权限的概念
    • [2.1 Linux权限的概念](#2.1 Linux权限的概念)
      • [2.1.1 用户](#2.1.1 用户)
      • [2.1.2 指令](#2.1.2 指令)
        • [2.1.2.1 su指令](#2.1.2.1 su指令)
        • [2.1.2.2 sudo指令](#2.1.2.2 sudo指令)
    • [2.2 Linux权限管理](#2.2 Linux权限管理)
      • [2.2.1 文件访问者的分类(人)](#2.2.1 文件访问者的分类(人))
      • [2.2.2 文件类型和访问权限(事物属性)](#2.2.2 文件类型和访问权限(事物属性))
        • [2.2.2.1 文件类型](#2.2.2.1 文件类型)
        • [2.2.2.2 基本权限](#2.2.2.2 基本权限)
    • [2.3 文件权限值的表示方法](#2.3 文件权限值的表示方法)
      • [2.3.1 字符表示法](#2.3.1 字符表示法)
      • [2.3.2 八进制数值表示法](#2.3.2 八进制数值表示法)
    • [2.4 文件访问权限的相关设置方法](#2.4 文件访问权限的相关设置方法)
      • [2.4.1 chmod指令](#2.4.1 chmod指令)
      • [2.4.2 chown指令](#2.4.2 chown指令)
      • [2.4.3 chgrp指令](#2.4.3 chgrp指令)
      • [2.4.4 umask指令](#2.4.4 umask指令)
      • [2.4.5 file指令](#2.4.5 file指令)
    • [2.5 目录的权限](#2.5 目录的权限)
    • [2.6 粘滞位](#2.6 粘滞位)
    • [2.7 总结](#2.7 总结)
  • 结尾

一、shell命令

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

  • 内核是操作系统的核心,负责处理复杂的系统资源和任务。用户并不擅于直接与内核进行直接交流

  • 直接操作内核可能会导致系统不稳定或安全问题。内核中的错误或不当操作可能会对系统造成严重影响,甚至导致系统崩溃。通过Shell等中间层,可以对用户的操作进行一定的限制和检查,确保系统的安全和稳定。

  • Shell提供了更加友好和灵活的用户界面,允许用户以更加直观和便捷的方式与内核进行交互。

从技术角度,Shell的最简单定义:命令行解释器主要包含:

  • 将使用者的命令翻译给内核(kernel)处理。
  • 同时,将核心的处理结果翻译给使用者。

对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。

shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。


二、Linux权限的概念

2.1 Linux权限的概念

2.1.1 用户

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

  • 超级用户:可以在linux系统下做任何事情,不受限制
  • 普通用户:在linux下做有限的事情。
  • 超级用户的命令提示符是"#",普通用户的命令提示符是"$"。

2.1.2 指令

2.1.2.1 su指令

语法su [用户名]

功能:切换用户。

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


2.1.2.2 sudo指令

使用sudo指令之前,普通账号需要在root账号

语法sudo [选项] [命令]

功能:sudo命令可以让普通用户以超级用户或其他用户的身份执行命令,而不需要知道超级用户的密码。

常用选项

  • -l:列出当前用户可以执行的sudo命令及其对应的权限。
  • -u:以指定的用户身份执行命令,格式为-u 用户名。
  • -i:以root用户的身份登录shell,即切换到root用户的环境。

sudo命令的配置

配置文件:sudo的配置文件是/etc/sudoers,该文件定义了哪些用户可以执行哪些命令。

由于这里还没有讲到vim的相关知识,大家可以在后面一篇文章中学习完vim的基本操作了再进行sudo命令的配置。

这里我来为大家讲述如何创建一个普通用户,并配置sudo命令。

  1. 在root账号下,创建普通账号并设置登录密码
cpp 复制代码
adduser 用户名 // 创建普通用户
passwd 用户名  //设置普通用户登录密码
  1. 配置sudo命令
    • 输入vim /etc/sudoers进入文件
    • 按shift+;会出现一个冒号,输入set nu显示行号
    • 滑到100行处,就会出现我们需要修改的部分
    • 将光标移动到上述图片红色正方形处,按yy进行复制,再按p对内容进行复制
    • 按i进入插入模式,对刚刚粘贴部分中的root改为你的新建普通用户的用户名
    • 按ESC退出插入模式,再按shift+;会出现一个冒号,输入 wq! 强制保存并退出。

按照上面的步骤操作即可完成对sudo指令的配置。


2.2 Linux权限管理

2.2.1 文件访问者的分类(人)

  • 文件和文件目录的所有者:u-----User
  • 文件和文件目录的所有者所在的组的用户:g---Group
    • 一个组可以只有一个人
    • 一个组可以有很多人,用组长的名字对组进行命名
  • 其它用户:o---Others

为啥要有所属组呢? 有所有者和其他用户不是应该就够了吗?

假设张三和李四在同一个公司分别在A小组和B小组做相同的项目,张三的项目已经做3/4了,老板想看看张三做的项目,如果只有所有者和其他用户,老板想看张三的代码,那么张三只能开启other的读权限,那么张三的代码既能被老板看到,也能被李四看到,那么这样会导致张三的代码可能会被李四剽窃,而有了所属组,张三就可以将老板加入所属组,并开启所属组的读权限,那么张三的代码就只能被老板看而不能被李四看到。


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

为什么上面有图片中只有所有者和所属组,没有other呢?因为没有必要,除去所属组和所属组剩下就是other了。

没有对应的权限会怎么样

以下图为例提一个问题,用户去掉文件拥有者的读权限,但是保留所属组的读权限,并且用户是所属组的组长,为什么不能读文件内的内容呢?

用户会按照顺序拥有者、所属组和其他用户的顺序匹配,如果用户匹配了拥有者则不会再向后匹配了,否则再向后面匹配,这里用户是拥有者也是所属组组长,不能因为拥有者的权限没有或少于所属组权限就继续向后匹配,所以这里用户匹配拥有者的权限,所以用户不能读文件内的内容。


2.2.2.1 文件类型
  • -:普通文件、源代码、可执行程序、库等

  • d:文件夹(目录)

  • l:软链接文件(类似Windows的快捷方式)

    可以使用ln指令创建软连接文件,具体使用我会在后面的文章中讲述到。

  • b:块设备文件(例如硬盘、光驱等)

  • p:管道文件,主要用于进程间的通信,它允许一个进程将数据写入管道的写入端,而另一个进程可以从管道的读取端读取数据。

  • c:字符设备文件(例如键盘、显示屏等)(终端设备是字符设备的一种)

    在我们向显示器打印整数985的时候是输出一个一个的字符还是输出整数985?那么我们在输入一个整数的时候是输入一个个字符还是输入的整数呢?

    实际上我们向显示器打印整数985的时候printf("%d",985),printf会将整数985格式化输出,输出一个一个的字符,所以显示器就是字符设备。当我们敲击键盘输入一个整数时,int x = 0 , scanf("%d",&x),实际上也是输入的一个一个字符,而输入的字符最终由格式化控制最终拼成一个整数,所以键盘也是一个字符设备,而上一篇文章中我为大家灌输了一个概念:Linux下一切皆文件!所以键盘和显示器就是字符设备文件


    当我们输入ll /dev/pts*时,会显示设备文件的详细的信息,我们发现这里只有两个设备文件,当我们在开一台设备再试试,我们可以发现多了一个设备文件。

    那么如果在这个时候给这个多出来的设备文件输入信息回发生什么呢?我们发现文件的内容在新开的设备中显示了出来


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

2.3 文件权限值的表示方法

2.3.1 字符表示法

Linux表示 说明
rwx 可读可写可执行
rw- 可读可写
r-x 可读可执行
r- - 可读
-wr 可写可执行
- w - 可写
- - x 可执行
- - - 无权限

2.3.2 八进制数值表示法

权限符号 八进制 二进制
rwx 7 1 1 1
rw- 6 1 1 0
r-x 5 1 0 1
r- - 4 1 0 0
-wr 3 0 1 1
- w - 2 0 1 0
- - x 1 0 0 1
- - - 0 0 0 0

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

2.4.1 chmod指令

功能 :设置文件的访问权限
语法chmod [选项] 权限 文件名
常用选项

  • R -> 递归修改目录文件的权限

说明:只有文件的拥有者和root才可以改变文件的权限

用户符号

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

chmod命令权限格式

  1. 用户表示符+/-=权限字符
    • +:向权限范围增加权限代号所表示的权限

    • -:向权限范围取消权限代号所表示的权限

    • =:权限范围赋予权限代号所表示的权限


  1. 三位8进制数字

    三位8进制数字对应着拥有者、所属组和其他用户的8进制权限,以下面chmod 664 test.c为例,6代表的权限是rw-,4代表的权限是r--,所以这一段指令是将test.c文件的拥有者权限改为rw-,所属组的权限改为rw-,其他用户的权限改为r--


2.4.2 chown指令

功能 :修改文件的拥有者
语法chown [选项] 用户名 文件名

从下面的图片中我们可以看出在没有提权的情况下直接修改文件的拥有者是不行的,为什么呢?

在现实中我们送别人东西并不是直接"唉呀,给你给你",还需别人的接收,Linux中同样如此,但是Linux中没有直接对应"接收"的机制来同意拥有者的变更,那么这里直接提权强制将文件"送"出去。


2.4.3 chgrp指令

功能 :修改文件或目录的所属组
格式 :chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组


2.4.4 umask指令

功能:查看或修改文件掩码

新建文件默认权限=0666

新建目录默认权限=0777

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

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


2.4.5 file指令

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

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

2.5 目录的权限

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

  • 可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.

  • 可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件

于是, 那么这里提出一个问题,是否只要用户具有目录的写权限,用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限。这好像不太科学啊,我张三创建的一个文件,凭什么被你李四可以删掉?

我们发现如果有权限的情况下,李四确实可以将张三的文件删除,但是一般这种情况是不会发生的,因为在/home这个目录下就进不去,更别说里面的文件了

但是还有一种情况就是两个需要在同一个目录下进行合作,那么这种情况一般都是root账号在根目录下创建一个目录,两人都在这个目录工作,李四还是可以将张三的文件删除,那么应该怎么办呢?为了解决这个问题, Linux引入了粘滞位的概念。


2.6 粘滞位

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

  1. 超级管理员删除
  2. 该目录的所有者删除
  3. 该文件的所有者删除



2.7 总结

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

结尾

如果有什么建议和疑问,或是有什么错误,大家可以在评论区中提出。

希望大家以后也能和我一起进步!!🌹🌹

如果这篇文章对你有用的话,希望大家给一个三连支持一下!!🌹🌹

相关推荐
Narutolxy3 分钟前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin
bitcsljl5 分钟前
Linux 命令行快捷键
linux·运维·服务器
ac.char8 分钟前
在 Ubuntu 下使用 Tauri 打包 EXE 应用
linux·运维·ubuntu
Hello.Reader10 分钟前
全面解析 Golang Gin 框架
开发语言·golang·gin
禁默21 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood27 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑30 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
程序猿进阶33 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
Youkiup35 分钟前
【linux 常用命令】
linux·运维·服务器
qq_4336184436 分钟前
shell 编程(二)
开发语言·bash·shell