• Linux基础篇之文件权限问题讲解


      个人主页:欢迎大家光临——>沙漠下的胡杨

      各位大帅哥,大漂亮

     如果觉得文章对自己有帮助

     可以一键三连支持博主

     你的每一分关心都是我坚持的动力

     

     ☄: 本期重点:Linux下的权限

      希望大家每天都心情愉悦的学习工作。 


    目录

     ☄: 本期重点:Linux下的权限

    shell外壳程序:

    权限的概念:

    简单认识文件的属性

    权限中 “人” 的概念

    文件的权限:

    2.修改事物的属性

    面试题总结:

    1.目录权限

    2.umask权限掩码

    3.粘滞位

    权限的总结:


    shell外壳程序:

    我们先从操作系统和shell外壳说起,我们的Linux实际上是一个操作系统,但是我们一般人能不能够直接操作操作系统,要使用一个外壳程序来帮助我们使用操作系统。

    从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
    将使用者的命令翻译给核心(kernel)处理。同时,将核心的处理结果翻译给使用者。
    我们一般使用windows时,是通过点击图形化界面的方式进行操作的。而我们使用Linux时,是使用一个外壳程序来进行对我们的指令解析给操作系统,最后通过内核进行运算后,输出结果,然后shell外壳在进行解析呈现到人的面前。

    这也就是我们在使用shell外壳的原理,我们敲击的各种命令其实上也不是直接访问的操作系统。

    权限的概念:

    我们在Linux下用户是被分为两类的,一类是超级用户,也就是root,一类是普通用户。他们之间的区别如下:

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

    当然我们不能让一个文件做不属于它属性外的事情,比如你让一个文件给你买菜做饭,或者是让一个文件给你填饱肚子,这些都是不属于这个文件的属性,此时即使是超级用户也不行,也就是说权限这个东西,其实上是当文件有这些属性时,在当前用户下你是否可以执行一些命令。

    所以说权限的核心就是:用户+事物的属性。

    简单认识文件的属性

    我们简单的看下一个文件的基本属性吧,我们 ls -l 或者 ll 可以查看文件详细的属性。

    1. [ssh@VM-4-10-centos 22.7.24]$ ls -l
    2. total 4
    3. -rw-rw-r-- 1 ssh ssh 12 Jul 24 16:39 test.txt

    这是文件的基本属性,我们整体分析下:

    1.   ll显示的第一个字符表示的是文件的类型:

    d:表示的是目录文件。(常见)

    -:表示的是普通文件(可执行的文件也是普通文件)(常见)

    p:  表示的是管道文件

    b:  表示的是块设备(磁盘设备)

    c:  表示的是字符设备(键盘或者显示器)

    l :表示的是链接文件 

    文件的拥有者和所属组以及other

    拥有者:就是文件属于谁。

    所属组:文件属于那个组。

    other:如果都不属于,那么就是other。

    剩下的属性比较简单就不再解释。

    权限中 “人” 的概念

    我们上述说了,在Linux下可以有多个用户,可以有超级用户,这些是实际中对应的是用户的概念,一般我们不谈论root,因为root不受权限约束,我们针对一个文件对不同用户的权限,

    其中文件常见的属性为读(r)写(w)可执行(x),    我们根据其中的权限的不同,把用户分为了三类 “人” :

    1. 拥有者

    文件属于谁谁就是拥有者。拥有者权限对应的是 ll 显示文件名中第2个到第4个字符。其中这三个字符分别对应的是读(r)写(w)可执行(x)。

    2.所属组

    和文件的拥有者一组的成员,就叫做所属组。就像我们日常的工作分组。所属组权限对应的是 ll 显示文件名中第5个到第7个字符,这三个字符对应的是读(r)写(w)可执行(x)。

    3.other

    不属于上面的任何一个,就是other,other权限对应的是 ll 显示文件名中第5个到第7个字符,这三个字符对应的是读(r)写(w)可执行(x)。

    所以权限我们是分“人”来看的,不同的人有不同的权限。而每个人具体点就是普通用户,而超级用户(root)不受权限约束。

    注意:在Linux下,我们文件的区分就是 ll 显示的第一个字符,表示的文件类型决定的,不以后缀进行区分,而在windows下我们是以后缀区分的。但是,我们在Linux下的一些工具,比如gcc,这些工具会以文件后缀区分文件,但是在Linux系统看来,是没有任何区别的,所以Linux下,也不排斥这种现象。 

    文件的权限:

    我们怎么描述一个文件的权限呢?

    1. [ssh@VM-4-10-centos 22.7.24]$ ls -l
    2. total 4
    3. -rw-rw-r-- 1 ssh ssh 12 Jul 24 16:39 test.txt

    这个文件,拥有者具有读写权限,所属组具有读写权限,other只有读权限。

    那我们怎么修改权限呢?

    首先,权限的核心是:“人” +事务属性。

    1. 我们可以通过修改 “人”,来获取不同的权限,我们可以通过更高级的权限,来进行修改文件的拥有者或者所属组,达到我们的目的。

    常见的方法:<1>切换成root进行修改。<2>使用root同级的权限修改(sudo指令)

    我们使用root权限修改拥有者和所属组后发现,我们文件的拥有者和所属组已经发生改变,如果我们此时把文件进行写入,我们发现不能写入了,原因是我们现在是other了,只有读权限,没有写权限了。这个叫做修改 “人” 的操作,我们改变了我们访问的权限。

    1. [ssh@VM-4-10-centos 22.7.24]$ ls -l
    2. total 4
    3. -rw-rw-r-- 1 ssh ssh 12 Jul 24 16:39 test.txt
    4. [ssh@VM-4-10-centos 22.7.24]$ whoami
    5. ssh
    6. [ssh@VM-4-10-centos 22.7.24]$ su
    7. Password:
    8. [root@VM-4-10-centos 22.7.24]# ls -l
    9. total 4
    10. -rw-rw-r-- 1 ssh ssh 12 Jul 24 16:39 test.txt
    11. [root@VM-4-10-centos 22.7.24]# chown huyang test.txt
    12. [root@VM-4-10-centos 22.7.24]# ls -l
    13. total 4
    14. -rw-rw-r-- 1 huyang ssh 12 Jul 24 16:39 test.txt
    15. [root@VM-4-10-centos 22.7.24]# chgrp huyang test.txt
    16. [root@VM-4-10-centos 22.7.24]# ls -l
    17. total 4
    18. -rw-rw-r-- 1 huyang huyang 12 Jul 24 16:39 test.txt
    19. [root@VM-4-10-centos 22.7.24]# exit
    20. [ssh@VM-4-10-centos 22.7.24]$ whoami
    21. ssh
    22. [ssh@VM-4-10-centos 22.7.24]$ cat test.txt
    23. hello world
    24. [ssh@VM-4-10-centos 22.7.24]$ echo you can see me > test.txt
    25. bash: test.txt: Permission denied

    2.修改事物的属性

    我们可以通过修改文件拥有者,所属组,other的读,写,可执行,来进行权限的修改。就是对针对具体的“人”来修改,相对应的权限。

    我们是可以使用以下两种方法进行修改权限:

    <1>chmod 用户表示符 (+   -   = )文件路径(文件名)

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

     

    我们先把拥有者的全部权限去掉,把所属组的读和可执行去掉,再把other的可执行权限加上,接着把拥有者只赋予读权限,把所属组的全部权限加上,再把other的所有权限去掉。

    最后把所有人的所有权限加上。

    1. [ssh@VM-4-10-centos 22.7.24]$ ll
    2. -rw-rw-r-- 1 ssh ssh 12 Jul 24 16:39 test.txt
    3. [ssh@VM-4-10-centos 22.7.24]$ chmod u-rwx test.txt
    4. [ssh@VM-4-10-centos 22.7.24]$ ll
    5. ----rw-r-- 1 ssh ssh 12 Jul 24 16:39 test.txt
    6. [ssh@VM-4-10-centos 22.7.24]$ chmod g-rx test.txt
    7. [ssh@VM-4-10-centos 22.7.24]$ ll
    8. -----w-r-- 1 ssh ssh 12 Jul 24 16:39 test.txt
    9. [ssh@VM-4-10-centos 22.7.24]$ chmod o+x test.txt
    10. [ssh@VM-4-10-centos 22.7.24]$ ll
    11. -----w-r-x 1 ssh ssh 12 Jul 24 16:39 test.txt
    12. [ssh@VM-4-10-centos 22.7.24]$ chmod u+r test.txt
    13. [ssh@VM-4-10-centos 22.7.24]$ ll
    14. -r---w-r-x 1 ssh ssh 12 Jul 24 16:39 test.txt
    15. [ssh@VM-4-10-centos 22.7.24]$ chmod g+rwx test.txt
    16. [ssh@VM-4-10-centos 22.7.24]$ ll
    17. -r--rwxr-x 1 ssh ssh 12 Jul 24 16:39 test.txt
    18. [ssh@VM-4-10-centos 22.7.24]$ chmod o-rwx test.txt
    19. [ssh@VM-4-10-centos 22.7.24]$ ll
    20. -r--rwx--- 1 ssh ssh 12 Jul 24 16:39 test.txt
    21. [ssh@VM-4-10-centos 22.7.24]$ chmod a+rwx test.txt
    22. [ssh@VM-4-10-centos 22.7.24]$ ll
    23. -rwxrwxrwx 1 ssh ssh 12 Jul 24 16:39 test.txt

    <2>我们发现,一个文件要么可以读,要么不可以读,要么可以写,要么不可以写,最后得出结论这个权限是两态的,所以我们可以用三位8进制数来表示文件的权限

    我们要给拥有者所有权限,给所属组读写权限,给other只读,我们可以表示为  764.

    1. [ssh@VM-4-10-centos 22.7.24]$ chmod 764 test.txt
    2. [ssh@VM-4-10-centos 22.7.24]$ ll
    3. total 4
    4. -rwxrw-r-- 1 ssh ssh 12 Jul 24 16:39 test.txt

    注意:

    如果给一个普通的文本文件赋予可执行权限,它也不能执行,因为赋予它权限和他能行使权限是两码事,赋予了也不一定能够可以。

    1. [ssh@VM-4-10-centos 22.7.24]$ ./test.txt
    2. ./test.txt: line 1: hello: command not found

    面试题总结:

    1.目录权限

    首先对于目录来说我们也有读,写,可执行权限之分,我们要进入目录需要可执行权限,我们显示目录需要读权限,我们在目录创建文件需要可执行权限。


    我们此时是文件的拥有者,我们把该目录的可执行权限去掉,其他的都不变,发现我们不能够进入目录,然后我们把可执行权限加上后,发现可以进入,所以进入目录需要可执行权限,同理我们要显示目录,需要的是读权限,在目录下创建问价需要的是写权限。

    1. [ssh@VM-4-10-centos ~]$ ll
    2. drwxrwxr-x 4 ssh ssh 4096 Jul 24 16:38 CSDN
    3. [ssh@VM-4-10-centos ~]$ chmod u-x CSDN/
    4. [ssh@VM-4-10-centos ~]$ ll
    5. drw-rwxr-x 4 ssh ssh 4096 Jul 24 16:38 CSDN
    6. [ssh@VM-4-10-centos ~]$ cd CSDN/
    7. -bash: cd: CSDN/: Permission denied
    8. [ssh@VM-4-10-centos ~]$ chmod u+x CSDN/
    9. [ssh@VM-4-10-centos ~]$ ll
    10. drwxrwxr-x 4 ssh ssh 4096 Jul 24 16:38 CSDN
    11. [ssh@VM-4-10-centos ~]$ cd CSDN/
    12. [ssh@VM-4-10-centos CSDN]$ ll
    13. drwxrwxr-x 2 ssh ssh 4096 Jul 22 21:06 22.7.21
    14. drwxrwxr-x 2 ssh ssh 4096 Jul 24 16:39 22.7.24

    2.umask权限掩码

    我们如果创建一个目录或者创建一个普通文件,那么它的默认权限是什么样子呢?默认的目录权限是775,普通文件权限是664,为什么呢?可以更改默认权限吗?

    1. [ssh@VM-4-10-centos 22.7.24]$ umask
    2. 0002
    3. [ssh@VM-4-10-centos 22.7.24]$ touch test.c
    4. [ssh@VM-4-10-centos 22.7.24]$ mkdir mydir
    5. [ssh@VM-4-10-centos 22.7.24]$ ll
    6. total 4
    7. drwxrwxr-x 2 ssh ssh 4096 Jul 25 14:54 mydir
    8. -rw-rw-r-- 1 ssh ssh 0 Jul 25 14:54 test.c

    我们目录的初始权限是777,普通文件的起始权限是666,但是我们有一个叫umask的权限掩码,我们在权限掩码中出现的都不应该在最终权限也就是我们看到的权限中出现。

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

     

      

    所以我们可以通过修该umask的值来修改默认权限;

    1. [ssh@VM-4-10-centos 22.7.24]$ umask 0777
    2. [ssh@VM-4-10-centos 22.7.24]$ touch test
    3. [ssh@VM-4-10-centos 22.7.24]$ mkdir dir
    4. [ssh@VM-4-10-centos 22.7.24]$ ll
    5. total 4
    6. d--------- 2 ssh ssh 4096 Jul 25 15:11 dir
    7. ---------- 1 ssh ssh 0 Jul 25 15:11 test

     

    3.粘滞位

    现在有一个场景,就是很多用户在使用一个公开目录,在这个目录下,很多用户都会创建删除文件,那么他虽然访问不了你的文件,但是他是可以删除你的文件的,在这个情况下,我们需要给该目录设置粘滞位(chmod +t 目录名),这样我们就可以在该文件下保证不能删除别人的文件,别人也删除不了你的文件了。

    粘滞位特点:1.粘滞位只能对目录使用  2. 粘滞位谁设置的谁才能取消(root不受限制)

    权限的总结:

    1.权限的核心:“人”+事务属性。我们可以改变文件的人,也就是改变文件的拥有者,所属组

    来改变权限,我们还可以通过修改文件的属性,比如chmod 改变文件的读写执行权限。

    2.文件的基本属性,我们的 ll 命令的第一个字符表示文件的类型,Linux下不以文件后缀区分文件类型,但是linux下的一些工具会以后缀区分。

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

    下期我们讲解Linux下的工具。

  • 相关阅读:
    MySQL 的几种碎片整理方案总结(解决delete大量数据后空间不释放的问题)
    全局路线规划导读
    docker 设计及源码分析
    图--深度优先搜索
    相关性网络图
    Python hashlib 模块详细教程:安全哈希与数据完整性保护
    Rust中的输入输出格式变化(非常详细)
    sonarqube版本升级
    python使用from Crypto.Random import random时候出现winrandom导入失败的解决方法
    qrcodejs2 生成二维码 并上传oss
  • 原文地址:https://blog.csdn.net/m0_64770095/article/details/125946656