• 【Linux】shell命令与用户/文件权限


    🌈前言

    本篇文章进行Linux权限的学习!!!


    🌆 shell命令以及运行原理

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

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

    • 将使用者(用户)的命令通过shell外壳翻译给核心(kernel)处理
    • 同时,将核心的处理结果翻译给使用者
    1. 对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)

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

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

    外壳存在的意义:

    • 保护OS系统,如果用户输入错误的命令,外壳会将其过滤或拦住,不会交给OS去执行
    • 外壳可以降低操作OS的成本,比如windows GUI(图形化界面)
    [lyh_sky@localhost ~]$ shell
    bash: shell: 未找到命令...
    [lyh_sky@localhost ~]$ abcdef
    bash: abcdef: 未找到命令...
    [lyh_sky@localhost ~]$ ls
    install.sh  Linux_Study  公共  模板  视频  图片  文档  下载  音乐  桌面
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    总结:windows的外壳就是图形化界面,相当于Linux中的Shell命令解析器,是用来翻译命令交给OS的


    🌷Linux权限的概念

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

    Linux下分root用户和普通用户

    [lyh_sky@localhost ~]$ whoami	 	// 普通用户的命令行提示符是$
    lyh_sky
    [lyh_sky@localhost ~]$ su root 	 	// 切换到root用户
    密码: 							 	// 这里输入的密码是不回显的,实际上已经输入
    [root@localhost lyh_sky]# whoami 	// root用户的命令行提示符是#
    root
    [root@localhost lyh_sky]# su lyh_sky	// 可以随意进入任何用户,且不用输入密码
    [lyh_sky@localhost ~]$ whoami
    lyh_sky
    [lyh_sky@localhost ~]$ ll
    总用量 4
    -rw-r--r--.  1 root    root    827 91 19:07 install.sh
    drwxrwxr-x. 10 lyh_sky lyh_sky 126 1025 15:59 Linux_Study
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注意:root和普通用户在Linux下都必须设置密码,最好把root密码设置难一些


    Linux中的具体用户分类:

    • 文件和文件目录的所有者: u — User(所属用户)
    • 文件和文件目录的所有者所在的组的用户: g — Group(文件所属组)
    • 其它用户: o — Others (文件其他用户)

    root和普通用户可以是文件的所属者或所属组或其他用户


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

    在这里插入图片描述

    文件的类型:

    • -:普通文件 — 文本、源代码、可执行程序、第三方的静态库等等
    • d:目录文件
    • l:链接文件(类似与Windows上的快捷方式)
    • b:块设备文件 — 硬盘、光驱等等
    • p:管道文件
    • c:字符设备文件 — 屏幕等串口设备
    • s:套接口文件

    注意:

    • Linux不是以文件名后缀来区分文件的,而是通过ls-l指令显示的第一个字符区分文件类型的
    • Windows是以文件名后缀来区分文件类型的
    [lyh_sky@localhost /]$ pwd
    /
    [lyh_sky@localhost /]$ ls -l
    总用量 40
    lrwxrwxrwx.   1 root root     7 820 13:03 bin -> usr/bin
    dr-xr-xr-x.   5 root root  4096 92 09:28 boot
    drwxr-xr-x.  20 root root  3300 1027 11:47 dev
    drwxr-xr-x. 148 root root  8192 911 18:15 etc
    drwxr-xr-x.   4 root root    32 98 13:08 home
    lrwxrwxrwx.   1 root root     7 820 13:03 lib -> usr/lib
    lrwxrwxrwx.   1 root root     9 820 13:03 lib64 -> usr/lib64
    drwxr-xr-x.   2 root root     6 411 2018 media
    drwxr-xr-x.   3 root root    18 91 15:39 mnt
    drwxr-xr-x.   3 root root    16 820 13:08 opt
    dr-xr-xr-x. 224 root root     0 1027 11:47 proc
    dr-xr-x---.  10 root root  4096 1027 14:04 root
    drwxr-xr-x.  45 root root  1300 1027 11:48 run
    lrwxrwxrwx.   1 root root     8 820 13:03 sbin -> usr/sbin
    drwxr-xr-x.   2 root root     6 411 2018 srv
    dr-xr-xr-x.  13 root root     0 1027 11:47 sys
    drwxrwxrwt.  70 root root 16384 1027 14:04 tmp
    drwxr-xr-x.  13 root root   155 820 13:03 usr
    drwxr-xr-x.  21 root root  4096 820 13:15 var
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    虽然Linux下是以符合来确定文件类型的,但是安装在Linux下的软件是按后缀区分的

    [lyh_sky@localhost lesson8]$ ls
    test.cpp
    [lyh_sky@localhost lesson8]$ cat test.cpp 
    #include 
    using namespace std;
    
    int main()
    {
      cout << "hello world" << endl;
      return 0;
    }
    [lyh_sky@localhost lesson8]$ mv test.cpp test.txt
    [lyh_sky@localhost lesson8]$ ls
    test.txt
    [lyh_sky@localhost lesson8]$ g++ test.txt -o test
    test.txt: file not recognized: 不可识别的文件格式
    collect2: 错误:ld 返回 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    文件的基本权限:

    • 读(r/4): Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限

    • 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限

    • 可执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限

    注意:421对应八进制中的421,二进制中的100(4)、010(2)、001(1)


    🌹3、文件权限值的表示方法

    1. 字符表示方法

    在这里插入图片描述

    1. 八进制表示方法

    在这里插入图片描述


    🍀4、文件访问权限的相关设置方法

    🍁4.1、chmod指令

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

    常用选项:

    • R -> 递归修改目录文件的权限
    • 说明:只有文件的拥有者和root才可以改变文件的权限

    chmod命令权限的格式

    用户表示符+/-=权限字符:

    • +:向权限范围增加权限代号所表示的权限
    • -:向权限范围取消权限代号所表示的权限
    • =:向权限范围赋予权限代号所表示的权限

    用户符号:

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

    使用权限字符来修改文件权限

    [lyh_sky@localhost lesson8]$ touch test.txt
    [lyh_sky@localhost lesson8]$ ll
    -rw-rw-r--. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt
    
    // 对拥有者去掉读权限
    [lyh_sky@localhost lesson8]$ chmod u-r test.txt 
    [lyh_sky@localhost lesson8]$ ll
    --w-rw-r--. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt
    
    // 对拥有者加上读权限
    [lyh_sky@localhost lesson8]$ chmod u+r test.txt 
    [lyh_sky@localhost lesson8]$ ll
    -rw-rw-r--. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt
    
    // 对Others增加读写权限
    [lyh_sky@localhost lesson8]$ chmod o=rw test.txt 
    [lyh_sky@localhost lesson8]$ ll
    -rw-rw-rw-. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt
    
    // 对所有用户加上读写执行权限
    [lyh_sky@localhost lesson8]$ chmod a+rwx test.txt 
    [lyh_sky@localhost lesson8]$ ll
    -rwxrwxrwx. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    使用三位8进制数字来修改文件权限:

    // 000表示去掉全部用户的读写可执行权限
    [lyh_sky@localhost lesson8]$ chmod 000 test.txt 
    [lyh_sky@localhost lesson8]$ ll
    ----------. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt
    
    // 664 --- 表示加上文件拥有者和所属组的和写权限,但是其他用户只加上读权限
    [lyh_sky@localhost lesson8]$ chmod 664 test.txt 
    [lyh_sky@localhost lesson8]$ ll
    -rw-rw-r--. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt
    
    // 777 --- 表示加上全部用户的读写可执行权限
    [lyh_sky@localhost lesson8]$ chmod 777 test.txt 
    [lyh_sky@localhost lesson8]$ ll
    -rwxrwxrwx. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    注意:

    • 我们可以将八进制转换成二进制,二进制对应的就是权限
    • 权限由0和1表示,0表示没有权限,1表示有权限

    🍂4.2、chown指令

    功能:修改文件的拥有者
    格式: chown [参数] 用户名 文件名

    实例:

    [lyh_sky@localhost lesson8]$ sudo chown lhx test.txt 
    [sudo] lyh_sky 的密码:
    [lyh_sky@localhost lesson8]$ ll
    -rwxrwxrwx. 1 lhx lyh_sky 0 1027 15:42 test.txt
    
    [lyh_sky@localhost lesson8]$ sudo chown lyh_sky test.txt 
    [lyh_sky@localhost lesson8]$ ll
    -rwxrwxrwx. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可以使用chown [参数] 用户名:用户名 文件/目录名 一键修改用户所属者和所属组

    [lyh_sky@localhost lesson8]$ ll
    总用量 0
    -rwxrwxrwx. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt
    
    // 使用冒号一键修改所属者和所属组
    [lyh_sky@localhost lesson8]$ sudo chown lhx:lhx test.txt 
    [lyh_sky@localhost lesson8]$ ll
    总用量 0
    -rwxrwxrwx. 1 lhx lhx 0 1027 15:42 test.txt
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意:

    • 修改文件拥有者需要root用户才能修改,第一种方法:切换到root用户修改文件拥有者
    • 第二种方法:sudo短暂提升普通用户的权限至root

    🍃4.3、chgrp指令

    功能:修改文件或目录的所属组
    格式: chgrp [参数] 用户组名 文件名

    常用选项:

    • -R 递归修改文件或目录的所属组
    [lyh_sky@localhost lesson8]$ ll
    总用量 0
    -rwxrwxrwx. 1 lyh_sky lyh_sky 0 1027 15:42 test.txt
    
    // 修改文件所属组为lhx
    [lyh_sky@localhost lesson8]$ sudo chgrp lhx test.txt 
    [lyh_sky@localhost lesson8]$ ll
    总用量 0
    -rwxrwxrwx. 1 lyh_sky lhx 0 1027 15:42 test.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    🍄5、目录的权限

    目录的基本权限:

    • 读(r/4): 如果目录没有r权限,允许进入目录,允许在该目录下创建(写入)一个文件,不允许查看文件列表

    • 写(w/2):如果目录没有w权限,允许进入目录,允许在该目录下查看文件列表,但不允许创建和删除目录中文件/目录

    • 可执行(x/1):如果目录没有x权限,不允许进入目录

    • 如果同时没有rw权限,允许进入,但是不允许创建和查看目录下的文件列表(注意:不是文件内容!!!文件的内存是否可以查看,由文件自己的权限决定!!!)

    [lyh_sky@localhost lesson8]$ ll
    drwxrwxr-x. 2 lyh_sky lyh_sky 6 1027 18:16 dir
    
    // 去掉可执行权限
    [lyh_sky@localhost lesson8]$ chmod u-x dir
    [lyh_sky@localhost lesson8]$ ll
    drw-rwxr-x. 2 lyh_sky lyh_sky 6 1027 18:16 dir
    [lyh_sky@localhost lesson8]$ cd dir
    bash: cd: dir: 权限不够
    
    // 去掉读权限
    [lyh_sky@localhost lesson8]$ chmod u+x,u-r dir
    [lyh_sky@localhost lesson8]$ ll
    d-wxrwxr-x. 2 lyh_sky lyh_sky 6 1027 18:16 dir
    [lyh_sky@localhost lesson8]$ cd dir
    [lyh_sky@localhost dir]$ ll
    ls: 无法打开目录.: 权限不够
    
    // 去掉写权限
    [lyh_sky@localhost lesson8]$ chmod u+rx,u-w dir
    [lyh_sky@localhost lesson8]$ ll
    dr-xrwxr-x. 2 lyh_sky lyh_sky 6 1027 18:16 dir
    
    // 去掉写权限后不能创建或删除目录中的文件/目录
    [lyh_sky@localhost lesson8]$ cd dir
    [lyh_sky@localhost dir]$ ll
    [lyh_sky@localhost dir]$ touch file.txt
    touch: 无法创建"file.txt": 权限不够
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    🍅6、umask权限掩码

    为什么我们刚创建的目录权限默认是775,文件权限默认是664呢?(不同的系统可能有差异)

    [lyh_sky@localhost lesson8]$ mkdir dir
    [lyh_sky@localhost lesson8]$ touch file
    [lyh_sky@localhost lesson8]$ ll
    总用量 0
    drwxrwxr-x. 2 lyh_sky lyh_sky 6 1027 19:27 dir
    -rw-rw-r--. 1 lyh_sky lyh_sky 0 1027 19:27 file
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    因为我们创建的文件和目录都会受到umask(权限掩码)的影响:

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

    默认权限 != 最终权限

    格式: umask 权限值

    说明:

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

    在这里插入图片描述


    umask的使用:

    [lyh_sky@localhost lesson8]$ whoami
    lyh_sky
    [lyh_sky@localhost lesson8]$ umask		// 查看权限掩码
    0002
    
    [lyh_sky@localhost lesson8]$ umask 003	// 设置权限掩码
    [lyh_sky@localhost lesson8]$ umask
    0003
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    🍆7、粘滞位

    当我们在公司多个小组进行协作开发时,就需要一个临时目录(/tmp)来保存文件

    但是有一个问题:如果不小心删了文件怎么办?

    // 保存临时文件的目录
    [lyh_sky@localhost home]$ cd /tmp
    [lyh_sky@localhost tmp]$ ls all -dl
    drwxr-xrwx. 2 root root 21 91 10:32 all
    
    [lyh_sky@localhost tmp]$ cd all
    [lyh_sky@localhost all]$ ll
    -rwxrwxrwx. 1 lhx lhx 12 91 00:08 lhx.txt    // 别人的文件
    
    // 删除其他组成员的文件
    [lyh_sky@localhost all]$ rm -rf lhx.txt
    rm:是否删除有写保护的普通空文件 "/tmp/all/lhx.txt"? y
    [lyh_sky@localhost all]$ ls
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    为了解决这个不科学的问题, Linux引入了粘滞位的概念

    [root@localhost tmp]# pwd
    /tmp
    [root@localhost tmp]# ls all -dl
    drwxr-xrwx. 2 root root 21 91 10:32 all
    [root@localhost tmp]# chmod +t all			// 加上粘滞位
    [root@localhost tmp]# ls all -dl
    drwxr-xrwt. 2 root root 21 91 10:32 all // 目录中other的x权限变成了t
    
    // 进入普通用户,删除该文件失败
    [root@localhost tmp]# su lyh_sky
    [lyh_sky@localhost tmp]$ cd all
    [lyh_sky@localhost all]$ ls
    lhx.txt
    [lyh_sky@localhost all]$ rm lhx.txt 
    rm: 无法删除"lhx.txt": 不允许的操作
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    • 超级管理员删除
    • 该目录的所有者删除
    • 该文件的所有者删除

    🍇8、file指令(辨别文件类型)

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

    常用选项:

    • -c:详细显示指令执行过程,便于排错或分析程序执行的情形
    • -z:尝试去解读压缩文件的内容
    [lyh_sky@localhost lesson7]$ ll
    总用量 36
    -rw-rw-r--. 1 lyh_sky lyh_sky    71 1022 16:11 makefile
    -rwxrwxr-x. 1 lyh_sky lyh_sky 27072 1022 16:11 test
    -rw-rw-r--. 1 lyh_sky lyh_sky  1561 1021 21:36 test.cpp
    
    // C++源文件
    [lyh_sky@localhost lesson7]$ file test.cpp 
    test.cpp: C++ source, ASCII text
    
    // 可执行文件
    [lyh_sky@localhost lesson7]$ file test
    test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=a6a53d8a2d82b42768a1fe832e971613d2a09cfd, not stripped
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    Apache Doris 基础 -- 数据表设计(使用AUTO_INCREMENT)
    vue实现canvas电子签名
    题目 1119: C语言训练-“水仙花数“问题1(python详解)——练气三层中期
    华为H12-831题库
    视觉系统设计实例halcon-winform-12.条码、二维码识别
    理解CSS | 青训营笔记
    Java框架(三)--Spring IoC容器与Bean管理(8)--基于Java Config配置IoC容器及Spring Test测试模块
    python运行hhblits二进制命令的包装器类
    Ubuntu编译 PCL 1.13.1 详细流程
    手撕红黑树
  • 原文地址:https://blog.csdn.net/weixin_59400943/article/details/127548560