Linux文件权限管理及目录文件的深入理解。

文件权限及目录

初学Linux,感觉这个东西该复杂,而且逻辑非常的强。难~!

自己根据学习到的理论和实践,得出的对文件权限,进程,以及特殊权限的深入理解。希望能解决初学者对于权限的困惑。如有错误请指正。

文件的权限,指定的是什么?

是文件的权限位上的权限,针对三类用户,任何用户都必须是三类用户中的一种,属主属组和其他人的权限rwx
    -rw-r--r--. 1 root root     3 Jul 23 16:20 a
    -rw-------. 1 root root  1482 Jul 20 17:12 anaconda-ks.cfg
    -rw-r--r--. 1 root root    21 Jul 23 16:38 bc
    drwxr-xr-x. 7 root root  4096 Jul 20 18:46 cheat
    drwxr-xr-x. 2 root root  4096 Jul 20 17:19 Desktop

系统时如何识别用户?

登录系统的时候,输入用户名和密码。这时系统就通过用户名解析出用户的uid和gid。以后就靠这个识别用户的身份。解析使用的文件
/etc/passwd

Linux是多用户操作系统,同一用户名登录两个用户,操作系统又是如何知道那个用户运行了什么,而且不同用户的进程互不影响?

根据马哥视频将的Linux运行机制,我的个人理解如下
    用户空间,系统空间。每个用户都有自己的用户空间。即使是同名用户登录,使用的也不是相同的用户空间。用户空间是相互隔离的。用户空间不能访问系统空间。但是系统空间可以访问用户空间。
    用户运行程序,在内存中表现为进程,进程是用户的代理。它继承了用户的uid和gid。

系统如何为用户分配权限?。

例如一个程序cat运行了,文件的权限不是相对于cat程序本身,而是相对于cat在内存中的进程的身份uid和gid而言的。从而实现权限分配。
    [user1@yangyouwei ~]$ ll /bin/cat
    -rwxr-xr-x. 1 root root 48568 May 11 16:59 /bin/cat

    [user1@yangyouwei ~]$ id
    uid=702(user1) gid=702(user1) groups=702(user1) 

    [user1@yangyouwei ~]$ ll /tmp
    total 124
    -rw-r--r--. 1 root root   29 Jul 23 15:40 code
    -rw-r--r--. 1 root root    2 Jul 29 22:13 homework.txt

对cat程序的权限设置是任何人都能运行,但是/tmp/code文件的权限设置是,任何人都能读取,但是只有root用户能够修改该文件。其他的用户都只能读取不能写入内容。

权限匹配过程

系统先比较用户的uid与文件的属主的uid是否同一人,是的话应用属主权限
否则继续比较用户的gid与文件的属组的gid是否一致,一致应用属组的权限
否则应用其他人的权限。

特殊权限—身份变换的过程。

经过上面的介绍,我个人理解,suid和sgid只是系统在用户运行程序为进程后,改变进程的属主和组。只是个身份变换的过程。用户(用户发起的进程)获取是身份而非权限。要说权限,那就是具体到,该进程要访问那个文件,而那个文件的权限的设置才能决定用户进程访问该文件的权限。

通过实验得到的结果是:先运行程序为进程后再获取相应的身份

user1不是属主也不是属组。但是匹配了cat哪个权限位的x权限生效的?是其它人的x权限还是属主的x?

    [root@yangyouwei ~]# ll /tmp/cat
    -rwsr-xr-x. 1 root root 48568 Aug  1 15:05 /tmp/cat

    [user1@yangyouwei ~]$ /tmp/cat
        ##cat已经运行,等待用户通过标准输入输入内容。
    [root@yangyouwei ~]# ps aux
    root       2616  0.0  0.0 100944   552 pts/0    S+   15:08   0:00 /tmp/cat

程序已经执行,进程的属主为root。但是没有回答上面的问题

先将属主的x权限去掉。在执行以user1身份运行。
    为了看清,先去掉执行权限,在添加suid
    [root@yangyouwei ~]# chmod u-x /tmp/cat  
    [root@yangyouwei ~]# ll /tmp/cat        
    -rw-r-xr-x. 1 root root 48568 Aug  1 15:05 /tmp/cat
    [root@yangyouwei ~]# chmod u+s /tmp/cat   
    [root@yangyouwei ~]# ll /tmp/cat 
    -rwSr-xr-x. 1 root root 48568 Aug  1 15:05 /tmp/cat
        大S表示没有指向权限
再执行cat
    [user1@yangyouwei ~]$ /tmp/cat
可以执行,cat运行,等待用户通过标准输入输入内容。
    [root@yangyouwei ~]# ps aux
    root       2670  0.0  0.0 100944   548 pts/0    S+   15:20   0:00 /tmp/cat
看到已经cat已经运行。并且属主是root

另一个蛋疼实验。可以说明问题

如还有怀疑请将/tmp/cat的属主执行权限加上,在把其他人的执行权限去掉。看看还能运行吗?
不做演示了,结果是user1不能运行cat程序。设置了suid的程序的属主权限位,对于能够运行该程序的用户没有影响。

即使把/tmp/cat的权限改为属主无任何权限,其他人有执行权限,user1可以运行该程序。
对于使用/tmp/cat读取/tmp/cat,也就是catcat自己,这种蛋疼的问题的结果是。cat可以以root身份运行,但是cat不能读取cat程序文件。也就是执行成功,读取失败。

    注:cat读取cat程序,就是读取自己程序文件,正常情况是可读取的,就是一堆乱码。
        -rwxr-xr-x. 1 root root 48568 May 11 16:59 /bin/cat

        用户没有权限执行程序的报错是如下,要是做该实验自己对比实验结果。
            [user1@yangyouwei ~]$ useradd
            -bash: /usr/sbin/useradd: Permission denied

        用户没有读取权限cat的报错如下:
            [user1@yangyouwei ~]$ cat /etc/shadow
            cat: /etc/shadow: Permission denied

同时设置了suid和sgid的情况下,用户是其他人,用户运行的进程可以同时获得文件属主和属组的身份。

[root@yangyouwei ~]# ll /tmp/cat 
-rwSr-sr-x. 1 root root 48568 Aug  1 15:05 /tmp/cat  #cat的属主x权限还没有恢复也不影响结果。

[user1@yangyouwei ~]$ /tmp/cat  #user1运行cat

[root@yangyouwei ~]# ps axo user,ruser,group,rgroup,cmd
root     user1    root     user1    /tmp/cat
root     root     root     root     ps axo user,ruser,group,rgroup,cmd

对目录操作,改名,删除文件

根据老师所讲自己整理出,目录与文件(普通文件和目录)的关系。
要先摆脱windows形成的惯性思维,摒弃文件夹的概念。图形化的东西对于我们理解Linux下的原理有误导。

目录是什么?
目录是文件,目录的内容是目录下的文件列表--有吻合了Linux一切皆文件的理论。

文件列表内容包括:由文件(目录)名+文件(目录)的inod       是一一对应的关系。
文件名不是文件的一部分。文件对于系统而言仅是inod元数据+数据。文件名是给用户(人)用的。

改名和删除目录下的文件
    改名是改变文件列表,名字改变,但是inod不变。

        mv命令的工作原理:
        在同一文件系统上,mv只是针对目录操作,将目录下的文件列表中删除(移动到不同目录下,且在同一文件系统下)或改名(文件位置不变,仅仅是改了名字)
            [root@yangyouwei ~]# ll -i /tmp                  
            total 124
            3937387 -rwSr-sr-x. 1 root root 48568 Aug  1 15:05 cat
            3937395 -rw-r--r--. 1 root root    29 Jul 23 15:40 codechange

            [root@yangyouwei ~]# mv /tmp/codechange /tmp/code  #改名
            [root@yangyouwei ~]# ll -i /tmp/code 
            3937395 -rw-r--r--. 1 root root 29 Jul 23 15:40 /tmp/code
        文件的inod没有变化。

    删除,是删除文件名,随之文件的硬链接次数发生改变,为0时,inod释放掉,也就删除了文件。如果inod不为零,文件(数据)也没有被删除,

        cp命令的工作原理:
        先建立一个空文件(新的inod),在将文件读取到内存中,以数据流的方式填充到新建的空文件里,完成后再删除原文件。
            [root@yangyouwei ~]# cp /tmp/code ./codecp
            root@yangyouwei ~]# ll -i ./code 
            3937395 -rw-r--r--. 1 root root 29 Jul 23 15:40 /tmp/code
            [root@yangyouwei ~]# ll -i ./codecp 
            1442418 -rw-r--r--. 1 root root 29 Aug  1 16:02 ./codecp

原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/31873

(1)
上一篇 2016-08-10 10:27
下一篇 2016-08-10 10:27

相关推荐

  • 2016-10-17作业

    1 生产环境发现一台服务器系统时间产生偏差,造成服务异常,请帮忙校正。 date命令查看系统时间,clock或者hwclock命令查看硬件时间, 将系统时间同步到硬件时间的方法hwclock -s   2 生产有一个数据同步脚本需要执行很长时间,怎样做到无人值守,在管理工具退出的情况下,脚本依然能正常运行。在生产环境的中创建SCREEN会话,会话的…

    Linux干货 2016-10-18
  • 包管理之包查询,包校验,rpm数据库.yum的详细用法及说明

    一.概述 包查询 rpm {-q|–query} [select-options] [query-options] [select-options] -a: 所有包 -f: 查看指定的文件由哪个程序包安装生成 -p rpmfile:针对尚未安装的程序包文件做查询操作; –whatprovides CAPABILITY:查询指定的CAP…

    Linux干货 2016-08-30
  • 源码编译安装apache httpd-2.2.29

        1.程序包编译          程序包编译安装:   (需要gcc、make工具)            &…

    Linux干货 2016-08-24
  • 系统基础之Btrfs文件系统详解

    btrfs文件系统:技术预览版(centos7) 描述: Btrfs(B-tree,Butter FS,Better fs),GPL授权,Orale,2007 写实复制特性(Cow)     cp –reflink (只能在btrfs文件系统中使用) 想取代ext系统系统, 支…

    Linux干货 2016-09-21
  • 27期第一周学习小结

    第一周 1. 描述计算机的组成及其功能。 计算机主要组成部分以下五种:运算器,控制器,存储器,输入设备,输出设备。 运算器的功能是对数据进行算术运算与逻辑运算,就是对数据进行加工处理。 控制器的功能是调度二进制程序,数据,内存寻址,以及协调计算机输入设备和输出设备等各计算机部件之间的正常工作。 存储器的功能是存储二进制指令和数据。存储器是编址存储单元。 输入…

    Linux干货 2017-07-15
  • 查找find命令简介

       之前都是写一些关于课后练习题的博客,既练习了课后习题也把博客写了,舒服!不过这周学的知识需要练习的不多,更多的是需要了解和记忆,所以给大家介绍一个自我觉得挺强大的一个命令,那就是查找find命令。大家都知道计算机的数据茫茫多,要想找到自己想要的级必须加点限制性的条件来缩小一下范围,或者准确的告诉计算机你想要的是什么。那么怎么来实现呢…

    2017-08-12