zoukankan      html  css  js  c++  java
  • Linux课程笔记 文件和目录权限

    1.文件和目录权限

    1.1 文件目录属性

    Linux系统中文件和目录的属性主要有索引节点、类型、权限属性、链接数、所归属的用户和用户组、最近修改时间等内容。

    [root@test2 ~]# ls -li

    总计 23580

    …….

    1966616 drwxr-xr-x  2 root root      4096 05-27 12:21 test

    1876789 -rw-r--r--  1 root root        14 05-23 00:07 test.txt

    inode

    类型

    权限

    链接数

    用户

    用户组

    大小

    修改时间

    文件名

    1966616

    d

    rwxr-xr-x

    2

    root

    root

    4096

    05-27 12:21

    test

    1876789

    -

    rw-r--r--

    1

    root

    root

    14

    05-23 00:07

    Test.txt

    1.2索引节点

    每个存储设备或存储的分区被格式化为文件系统后,都应该有两部分:一部分是inode,另一部分是block,block是用来存储数据的,而inode是用来存储这些数据信息的,包括文件大小、属主、归属的用户组、读写权限等。

    使用ls –i 可以查看inode信息。

    Inode值相同的文件,对应的数据是同一份,可以把他们看成是互为硬链接的关系。当我们修改其中一个文件的内容时,互为硬链接的文件内容也会跟着变化。如果我们删除互为硬链接关系的某个文件时,另外的硬链接文件并不受影响,即文件数据还在。

    对比源文件和软链接文件:

    (1)       两个文件的inode节点值不同

    (2)       两个文件的文件类型不同,源文件是f(普通文件),而软链接文件是l(链接文件)

    (3)       两个文件的读写权限不同,源文件是rw-r—r--,而软链接文件的读写权限是rwxrwxrwx

    (4)       两个文件的硬链接个数相同。都是1

    (5)       两个文件的属主和所归属的用户组相同

    (6)       两个文件的创建或者修改时间不同

    特别提示:当我们修改链接文件的内容时,就意味着我们修改源文件的内容时,此时源文件的属性也会发生改变,但软链接文件的属性不会改变。

    1.3权限位

    1.3.1 权限位说明

    Linux普通文件的读、写、执行权限说明

    读:表示具有读取阅读文件内容的权限

    写:表示具有新增、修改文件内容的权限(特别提示:删除或修改文件受父目录的权限控制)

    执行:表示具有执行文件的权限

    Linux目录的读、写、执行权限说明

    读:浏览目录的权限

    写:修改目录内文件的权限

    执行:进入目录的权限

    特别注意:当删除或移动一个文件或目录,仅与该文件和目录所在的上一层目录权限有关,与该文件本身属性无任何关系,对于文件来说,写文件是修改文件,而不是删除文件,因此写文件是与该文件的本身属性有关系的。

    2.3.2改变权限属性的命令chmod

    Chmod是用来改变文件或目录权限的命令,但只有文件的属主和超级用户root才有这种权限。通过chmod来改变文件或目录的权限有两种方法:一种是通过权限字母和操作字符来设置权限:另一种方法是使用数字来设置权限

    (1) chmod数字设置权限法

    chmod  [数字组合] 文件名

    chmod的数字方法说明:

    r                  4

    w                 2

    x                  1

    -                   0

    示例:

    [root@test2 ~]# ll test.txt

    -rw-r--r-- 1 root root 14 05-23 00:07 test.txt

    [root@test2 ~]# chmod 755 test.txt

    [root@test2 ~]# ll test.txt

    -rwx[q4] r-xr-x 1 root root 14 05-23 00:07 test.txt

    [root@test2 ~]# ll test.txt

    -rwxr-x[q5] r-x 1 root root 14 05-23 00:07 test.txt

    [root@test2 ~]# ll test.txt

    -rwxr-xr-x[q6]  1 root root 14 05-23 00:07 test.txt

    如果我们想改变的仅仅是要打开的目录的权限,那么我们不加任何参数;如果想把目录下所有的文件或子目录也同时改变,需要使用参数-R。

       (2)chmod字母设置权限法

            chmod  [用户类型] [+|-|=] [授权字符] 文件名

            用户或用户组定义:

                       u:代表属主

                       g:代表属组

                       o:代表其它用户

                       a:代表属主、属组和其他用户,也就是上面的三个用户的所有

                       权限定义字母:

                       r:代表读权限

                       w:代表写权限

                       x:代表执行权限

                       权限增减字符:

                       +:添加某个权限

                       -:取消某个权限

                       =:赋予给定权限并取消其他权限

                       示例:

    [root@test2 ~]# ll test.txt

    -rwxr-xr-x 1 root root 14 05-23 00:07 test.txt

    [root@test2 ~]# chmod g+w test.txt   #-------à用户组添加写的权限

    [root@test2 ~]# ll test.txt

    -rwxrwxr-x 1 root root 14 05-23 00:07 test.txt

    [root@test2 ~]# chmod u=rx,g=wx,o=x test.txt #---à直接赋予用户读和执行的权限,用户组具有写和执行权限,其他用户只有执行权限

    [root@test2 ~]# ll test.txt

    -r-x-wx--x 1 root root 14 05-23 00:07 test.txt

    [root@test2 ~]# chmod a-x test.txt  #------------à三个权限组都减去执行的权限

    [root@test2 ~]# ll test.txt

    -r---w---- 1 root root 14 05-23 00:07 test.txt

    1.3.3默认权限分配的命令

    umask是通过八进制的数值来定义用户创建或目录的默认权限。umask表示的是禁止权限,文件盒目录略有不同。

    重要总结:

    对于文件来说,umask的设置是在假定文件拥有八进制权限666权限上进行,文件的权限666减去umask的掩码数值

    对于目录来说,umask的设置是在假定文件拥有八进制777权限上进行,目录八进制权限777减去umask的掩码数值

    示例:

    [root@test2 test]# ll  #----------à当前的目录为空

    总计 0

    [root@test2 ~]# umask #--------à查看当前uamsk值

    0022

    [root@test2 test]# touch qinbf.txt  #---------à创建新文件

    [root@test2 test]# ll

    总计 4

    -rw-r--r-- 1 root root 0 05-27 20:58 qinbf.txt

    #------à当前文件的权限为644,此为文件默认权限666减去022(umask值)所得

    [root@test2 test]# umask 044     #---------à修改umask值为044

    [root@test2 test]# touch qinbf2.txt  #---------à创建新文件

    [root@test2 test]# ll

    总计 8

    -rw--w--w- 1 root root 0 05-27 20:59 qinbf2.txt

    #--------à新文件的权限为422,此为文件的默认权限666减去umask值044所得

    -rw-r--r-- 1 root root 0 05-27 20:58 qinbf.txt

    [root@test2 test]# umask 555  #---------à修改umask值为555

    [root@test2 test]# touch qinbf3.txt  #---------à创建新文件

    [root@test2 test]# ll

    总计 12

    -rw--w--w- 1 root root 0 05-27 20:59 qinbf2.txt

    --w--w--w- 1 root root 0 05-27 20:59 qinbf3.txt

    #----------à请问老师,这里的文件权限为什么不是111(即--x—x--x)?

    权限的加减不能完全等于数字的加减,umask值为555,意味着是r+x的组合,所以文件最终得到的权限为默认的权限减去读(r)和执行(x)的权限,所以剩下写(w)的权限。可以理解为文件默认已经减去了执行的权限,最终默认权限为777-111=666。所以当umask的值为单数值时,就要注意了。

    -rw-r--r-- 1 root root 0 05-27 20:58 qinbf.txt

    [root@test2 test]# umask 666  #---------à修改umask值为666

    [root@test2 test]# touch qinbf4.txt  #---------à创建新文件

    [root@test2 test]# ll

    总计 16

    -rw--w--w- 1 root root 0 05-27 20:59 qinbf2.txt

    --w--w--w- 1 root root 0 05-27 20:59 qinbf3.txt

    ---------- 1 root root 0 05-27 21:00 qinbf4.txt

    #----------à新建的文件权限为空

    -rw-r--r-- 1 root root 0 05-27 20:58 qinbf.txt

                   umask一般都是放在用户的相关shell的配置文件中,比如用户家目录下的.bashrc或.profile,也可以放在全局性用户配置文件中,比如/etc/login.defs[q7] ,还可以放在SHELL全局的配置文件中,比如/etc/profile或/etc/bashrc等;

     

    2.文件和目录的实践

    注意1:以上操作在root和qinbf用户之间切换了身份,需注意每一步执行的身份。

    ===============================================================================

    在根目录下以两个用户名命名的目录,并保持目录归属和用户名一致

    ===============================================================================

    [root@test2 ~]# mkdir /qinbf

    [root@test2 ~]# mkdir /test

    [root@test2 ~]# ll -d /qinbf/  /test/

    drwxr-xr-x 2 root root 4096 05-28 15:23 /qinbf/

    drwxr-xr-x 2 root root 4096 05-28 15:23 /test/

    [root@test2 ~]# chown -R qinbf.qinbf /qinbf

    [root@test2 ~]# chown -R test.test /test

    [root@test2 ~]# ll -d /qinbf/ /test/

    drwxr-xr-x 2 qinbf qinbf 4096 05-28 15:23 /qinbf/

    drwxr-xr-x 2 test  test  4096 05-28 15:23 /test/

    ===============================================================================

    以root身份在两个新建目录下分别创建同名的文件,尝试以qinbf身份删除test用户的文件

    ===============================================================================

    [root@test2 ~]# touch /qinbf/qinbf-test

    [root@test2 ~]# touch /test/qinbf-test

    [root@test2 ~]# ll /qinbf/qinbf-test /test/qinbf-test

    -rw-r--r-- 1 root root 0 05-28 15:24 /qinbf/qinbf-test

    -rw-r--r--[q8]  1 root root 0 05-28 15:24 /test/qinbf-test

    [qinbf@test2 test]$ whoami

    qinbf

    [qinbf@test2 ~]$ ll -d /test/

    drwxr-xr-x[q9]  2 test test 4096 05-28 15:24 /test/

    [qinbf@test2 ~]$ cd /test/

    [qinbf@test2 test]$ rm -f qinbf-test

    rm: 无法删除 “qinbf-test”: 权限不够  

    [qinbf@test2 test]$ ll

    总计 4

    -rw-r--r-- 1 root root 0 05-28 15:24 qinbf-test  #--------------à权限不够,无法删除,还存在

    ===============================================================================

    将/test/qinbf-test给与qinbf用户写和执行的权限,qinbf用户再次尝试删除

    ===============================================================================

    [root@test2 ~]# chmod o+wx /test/qinbf-test

    [qinbf@test2 test]$ ll

    总计 4

    -rw-r--rwx 1 root root 0 05-28 15:24 qinbf-test

    [qinbf@test2 test]$ rm -f qinbf-test

    rm: 无法删除 “qinbf-test”: 权限不够  #------------à删除再次失败

    ===============================================================================

    调整策略,还原/test/qinbf-test为创建初的权限(只读),/test目录给与qinbf用户写的权限

    ===============================================================================

    [root@test2 ~]# chmod 644 /test/qinbf-test

    [root@test2 ~]# ll /test/qinbf-test

    -rw-r--r-- 1 root root 0 05-28 15:24 /test/qinbf-test

    [root@test2 ~]# chmod o+w /test/

    [root@test2 ~]# ll -d /test/

    drwxr-xrwx 2 test test 4096 05-28 15:24 /test/

    [qinbf@test2 test]$ rm -f /test/qinbf-test

    [qinbf@test2 test]$ ll

    总计 0      #--------------------à删除qinbf-test文件成功

    ===============================================================================

    再次创建/test/qinbf-test文件,并取消所有权限,验证文件的写入权限,qinbf用户再次删除

    ===============================================================================

    [root@test2 ~]# ll /test/

    总计 0

    [root@test2 ~]# touch /test/qinbf-test

    [root@test2 ~]# ll /test/qinbf-test

    -rw-r--r-- 1 root root 0 05-28 15:34 /test/qinbf-test

    [root@test2 ~]# chmod 000 /test/qinbf-test

    [root@test2 ~]# ll /test/

    总计 4

    ---------- 1 root root 0 05-28 15:34 qinbf-test

    [qinbf@test2 test]$ ll qinbf-test

    ---------- 1 root root 0 05-28 15:34 qinbf-test

    [qinbf@test2 test]$ echo "hello" >> qinbf-test

    -bash: qinbf-test: 权限不够   #-------------à由于没有w(写权限),无法写入文件内容

    [qinbf@test2 test]$ rm -f qinbf-test

    [qinbf@test2 test]$ ll        #-------------à但是可以删除该文件

    总计 0

    ===============================================================================

    再次创建/test/qinbf-test文件,验证文件的r、w权限以及移除文件需要目录的w权限

    ===============================================================================

    [root@test2 ~]# touch /test/qinbf-test

    [root@test2 ~]# ll /test/

    总计 4

    -rw-r--r-- 1 root root 0 05-28 15:36 qinbf-test

    [root@test2 ~]# echo "hello">>/test/qinbf-test

    [root@test2 ~]# ll /test/

    总计 4

    -rw-r--r-- 1 root root 0 05-28 15:38 qinbf-test

    [qinbf@test2 test]$ cat qinbf-test

    hello    # ----------à最后三位r--表明qinbf用户可以查看该文件内容

    [qinbf@test2 test]$ echo "qinbf">>qinbf-test

    -bash: qinbf-test: 权限不够 #--------à但是不能修改该文件

    [qinbf@test2 test]$ ll -d /test/

    drwxr-xrwx 2 test test 4096 05-28 15:36 /test/

    [qinbf@test2 test]$ mv qinbf-test /tmp/

    [qinbf@test2 test]$ ll

    总计 0   #-----------------à移除成功

    ===============================================================================

    验证目录的r(读)、x(进入)权限

    ===============================================================================

    [root@test2 ~]# chmod o-r /test/  #--------------à以root身份减去了,其他用户的r(读)权限

    [qinbf@test2 test]$ ll

    ls: .: 权限不够   #---------àqinbf用户已经无法阅览/test目录了,验证了r(读)权限的意义

    [qinbf@test2 test]$ cd ..  #--------à先退出/test目录

    [root@test2 ~]# chmod o-x /test/  #----------à减去其他用户的x权限

    [root@test2 ~]# ll -d /test/

    drwxr-x-w- 2 test test 4096 05-28 15:38 /test/  #------------à-w-表明只有写的权限

    [qinbf@test2 /]$ cd /test/  #---------------à此时已经无法进入目录,验证了x(进入)的权限

    -bash: cd: /test/: 权限不够

    注意2:严格来说演示的时候,/test/qinbf-test的归属应该都是test,test,而不是root,使用chmod修改权限的时候,最好以test用户的身份来修改,而不是root。

     

    3.文件和目录特殊权限位介绍

    3.1 setuid和setgid介绍

    setuid和setgid位是让普通用户可以以root用户的角色运行只有root账号才能运行的程序或命令。(注意su和sudo的区别)

    普通用户修改自己的密码,实际上是修改/etc/passwd这个文件的内容。而普通用户修改/etc/passwd几乎是不可能的事,那么为什么普通用户可以通过passwd命令来修改密码呢。

    因为/usr/bin/passwd文件已经设置了setuid位,所以普通用户在执行/usr/bin/passwd命令时能够使用root用户的权限,间接的修改/etc/passwd,以达到修改自己口令的权限。

    [root@test2 ~]# ll /usr/bin/passwd

    -rwsr-xr-x 1 root root 27936 2010-08-11 /usr/bin/passwd

    为了完成只有root用户才能完成的工作,我们必须为普通用户提升权限,最常用的方法济源市su或sudo。虽然setuid和setgid也是让普通用户超越自身拥有的权限达到使用root权限的方法,但不推荐大家使用,因为它能为系统带来安全隐患。

    3.2字符修改特殊权限的方法:

    [root@test2 test]# chmod u+s test

    [root@test2 test]# ll

    总计 4

    --wS-w--w- 1 root root 0 05-27 21:08 test

    [root@test2 test]# chmod u+x test

    [root@test2 test]# ll

    总计 4

    --ws-w--w- 1 root root 0 05-27 21:08 test

    [root@test2 test]# chmod g+s test

    [root@test2 test]# ll

    总计 4

    --ws-wS-w- 1 root root 0 05-27 21:08 test

    [root@test2 test]# chmod g+x test

    [root@test2 test]# ll

    总计 4

    --ws-ws-w- 1 root root 0 05-27 21:08 test

    [root@test2 test]# chmod o+t test

    [root@test2 test]# ll

    总计 4

    --ws-ws-wT 1 root root 0 05-27 21:08 test

    [root@test2 test]# chmod o+x test

    [root@test2 test]# ll

    总计 4

    --ws-ws-wt 1 root root 0 05-27 21:08 test

    注意:如果对应的权限位上没有执行权限x,那么对应的特殊权限就是大写字母,添加执行权限x之后,就是小写字母。

    3.3数值修改权限位的方法:

    [root@test2 test]# chmod 000 test   

    [root@test2 test]# ll

    总计 4

    ---------- 1 root root 0 05-27 21:08 test

    [root@test2 test]# chmod 4000 test

    [root@test2 test]# ll

    总计 4

    ---S------ 1 root root 0 05-27 21:08 test

    [root@test2 test]# chmod 2000 test

    [root@test2 test]# ll

    总计 4

    ------S--- 1 root root 0 05-27 21:08 test

    [root@test2 test]# chmod 1000 test

    [root@test2 test]# ll

    总计 4

    ---------T 1 root root 0 05-27 21:08 test

    [root@test2 test]# chmod 4100 test

    [root@test2 test]# ll

    总计 4

    ---s------ 1 root root 0 05-27 21:08 test

    [root@test2 test]# chmod 2010 test

    [root@test2 test]# ll

    总计 4

    ------s--- 1 root root 0 05-27 21:08 test

    [root@test2 test]# chmod 1001 test

    [root@test2 test]# ll

    总计 4

    ---------t 1 root root 0 05-27 21:08 test

    注意:如果对应的权限位上没有执行权限x,那么对应的特殊权限就是大写字母,添加执行权限x之后,就是小写字母。


     [q1]这串字符变为红底闪烁字符。

     [q2]已经恢复正常色,不再是红底闪烁字符

     [q3]之前被删除的qinbf文件inode号是1409027。名字虽然相同,但是inode号不同,且不同于qinbf_hard_link文件的inode号。

     [q4]user位,r(4)+w(2)+x(1)=7

     [q5]group位,r(4)+-(0)+x(1)=5

     [q6]other位,r(4)+-(0)+x(1)=5)

     [q7]用户的UID、GID的最大最小值以及密码过期期限等设置也是在/etc/login.defs文件中。

     [q8]/test/qinbf-test文件对于qinbf用户来说,只有r(读)的权限

     [q9]/test/目录对于qinbf用户来说,有r(阅读)和x(进入)的权限

  • 相关阅读:
    js 性能调试
    js 面向对象编程
    js 零碎
    如果遇到二维数组 想取某个字段的和
    昨天写支付接口时遇到支付接口返回数据接收地址,session数据丢失(或者说失效)的问题
    mysql报错: 1548-Cannot load from mysql.proc. The table is probably corrupted 解决办法
    php 时间倒计时代码 个人写法 有好的想法的欢迎贴出来分享
    linux 环境下安装mysql5.6
    关于数据库连接不上 出现错误的问题
    推荐一个不错的css3网站 可以直接调用的
  • 原文地址:https://www.cnblogs.com/fengze/p/6752419.html
Copyright © 2011-2022 走看看