zoukankan      html  css  js  c++  java
  • Linux 权限管理

    • Linux下一切都被抽象成了file,哪些进程可以访问哪些file,不可以访问哪些file,就是权限管理。

    • 每个file都有权限属性,可以用ls -l查看file的权限属性。

      3对rwx分别代表,用户,组,其他人的rwx。

      $ ls -l
      drwxrwxr-x. 2 ys ys 28 Nov 29 17:47 a
      

      file通过自己的权限属性来保护自己,让符合自己权限属性的进程访问,让不符合自己权限属性的进程不能够访问。

      权限属性是由权限位构成的,权限位(drwxrwxr-x等)说明表:

      文件类型位 用户的读权限位 用户的写权限位 用户的可执行权限位 主组的读权限位 主组的写权限位 主组的可执行权限位 其他用户的读权限位 其他用户的写权限位 其他用户的可执行权限位 user group
      d r w x r w x r - x ys ys
      • 3组rwxrwxrwx叫mode,使用chmod修改mode。

      • user,group叫ownership,

      • 文件:

        • r:可以获取file的元数据和数据内容
        • w:可以修改file的元数据和数据内容
        • x:可以运行此文件
      • 目录:

        • r:可以用ls命令获取目录里的内容列表,但不能使用ls -l获取目录里的详细内容列表。

        • w:可以在目录里,创建,删除文件。

        • x:可以cd到此目录,如果也有读权限,则可以使用ls -l获取目录里的详细内容列表。

          $ ll -d a
          drwxrwxr-x. 2 ys ys 28 Nov 29 17:47 a
          $ chmod u-x a
          $ ll -d a
          drw-rwxr-x. 2 ys ys 28 Nov 29 17:47 a
          $ cd a
          -bash: cd: a: Permission denied
          
          $ ls -l a
          ls: cannot access a/docker-ce.repo: Permission denied
          total 0
          -????????? ? ? ? ?            ? docker-ce.repo
          $ chmod u+x a
          $ ls -l a
          total 4
          -rw-rw-r--. 1 ys ys 2880 Nov 29 17:47 docker-ce.repo
          
    • Linux的权限判断逻辑:

      • 首先判断启动进程的用户是否和file的user相同?
        • 相同:使用第一组rwx
        • 不相同:判断启动进程的用户是否在file的group里面?
          • 在group里面:使用第二组rwx
          • 不在group里面:使用第三组rwx

    一,修改file的mode:chmod

    file的mode信息,只能由file的属主修改。

    • 用户分类:

      • u:file是由谁创建的
      • g:file的创建者的主组
      • o:其他
      • a:以上3种的总和
    • 语法:

      • chmod [OPTION]... MODE[,MODE]... FILE...

        • 只能操作某类用户的所有权限位,不能操作某类用户的单个权限位。没指定的权限位就被清除。

          u=rw

          g=w

          o=x

          a=rwx

          # ll /tmp/t1
          ----------. 1 root root 0 Dec 17 21:57 /tmp/t1
          # chmod ugo=rwx /tmp/t1
          # ll /tmp/t1
          -rwxrwxrwx. 1 root root 0 Dec 17 21:57 /tmp/t1
          # chmod ugo=rw /tmp/t1
          # ll /tmp/t1
          -rw-rw-rw-. 1 root root 0 Dec 17 21:57 /tmp/t1
          
          
        • 即能操作一类用户的单个权限位,也能操作多个权限位 。没指定的权限位,保持不变。

          u+,u-

          g+,g-

          o+,o-

          a+,a-

          # ll /tmp/t1
          -rwxr--r-x. 1 root root 0 Dec 17 21:57 /tmp/t1
          # chmod ug+rx /tmp/t1
          # ll /tmp/t1
          -rwxr-xr-x. 1 root root 0 Dec 17 21:57 /tmp/t1
          # chmod ugo-rwx /tmp/t1
          # ll /tmp/t1
          ----------. 1 root root 0 Dec 17 21:57 /tmp/t1
          
      • chmod [OPTION]... OCTAL-MODE FILE...

        一起操作3类用户的所有权限位

      • chmod [OPTION]... --reference=RFILE FILE...

        把某个文件的mode,设置成自己的mode

        # ll /tmp/t1
        -rwxr--r--. 1 root root 0 Dec 17 21:57 /tmp/t1
        # ll /etc/issue
        -rw-r--r--. 1 root root 23 Nov 23  2018 /etc/issue
        # chmod --reference=/etc/issue /tmp/t1
        # ll /tmp/t1
        -rw-r--r--. 1 root root 0 Dec 17 21:57 /tmp/t1
        
      • 修改目录的mode只影响目录本身,那么也想影响目录里面的所有文件和子目录呢?

        使用-R选项。

        使用-R时,最好使用+,-的方式,因为此方式不会影响没有指定的权限位。

        # pwd
        /tmp/test
        # ll
        -rw-rw-r--. 1 ys   ys   0 Dec 15 21:24 1 A
        -rw-rw-r--. 1 ys   ys   0 Dec 15 21:23 1aA
        -rw-rw-r--. 1 ys   ys   0 Dec 15 21:23 1As
        drwxr-xr-x. 2 root root 6 Dec 17 22:07 ss
        # chmod -R g+wx /tmp/test/
        # ll
        -rw-rwxr--. 1 ys   ys   0 Dec 15 21:24 1 A
        -rw-rwxr--. 1 ys   ys   0 Dec 15 21:23 1aA
        -rw-rwxr--. 1 ys   ys   0 Dec 15 21:23 1As
        drwxrwxr-x. 2 root root 6 Dec 17 22:07 ss
        

    二,修改file的ownership:chown chgrp

    这2个命令只有,有管理员权限的用户才可以使用

    chown:即可以修改file的user,也可以修改file的group

    chgrp:只能修改file的group。

    • 语法:即可以修改file的user,也可以修改file的group

      chown [OPTION]... [OWNER][:[GROUP]] FILE...里面的冒号换成点也可以。

      # ll -d /tmp/test
      drwxrwxr-x. 3 ys ys 49 Dec 17 22:07 /tmp/test
      # pwd
      /tmp/test
      # ll
      -rw-rwxr--. 1 ys   ys   0 Dec 15 21:24 1 A
      -rw-rwxr--. 1 ys   ys   0 Dec 15 21:23 1aA
      -rw-rwxr--. 1 ys   ys   0 Dec 15 21:23 1As
      drwxrwxr-x. 2 root root 6 Dec 17 22:07 ss
      # chown -R :zg1 /tmp/test
      # ll -d /tmp/test/
      drwxrwxr-x. 3 ys zg1 49 Dec 17 22:07 /tmp/test/
      # ll
      -rw-rwxr--. 1 ys   zg1 0 Dec 15 21:24 1 A
      -rw-rwxr--. 1 ys   zg1 0 Dec 15 21:23 1aA
      -rw-rwxr--. 1 ys   zg1 0 Dec 15 21:23 1As
      drwxrwxr-x. 2 root zg1 6 Dec 17 22:07 ss
      

      chown [OPTION]... --reference=RFILE FILE...:用法同chmod

    • 修改目录的ownership只影响目录本身,那么也想影响目录里面的所有文件和子目录呢?

      使用-R选项。

    三,大型思考

    用户za1对目录/tmp/fld/有写权限,但对文件/tmp/fld/t1没有写权限。

    问题1:用户za1可以修改/tmp/fld/t1文件的内容吗

    问题1答案:不可以

    问题2:用户za1可以删除/tmp/fld/t1吗

    问题2答案:可以

    验证:

    # ll -d /tmp/fld/
    drwxrwxr-x. 2 root zg1 16 Dec 17 22:34 /tmp/fld/
    # ll /tmp/fld
    -rw-r--r--. 1 root zg1 0 Dec 17 22:34 t1
    # su - za1
    Last login: Tue Dec 17 21:07:01 CST 2019 on pts/1
    $ id za1
    uid=1001(za1) gid=1001(za1) groups=1001(za1),1000(ys),1002(zg1)
    $ pwd
    /tmp/fld
    $ ll
    -rw-r--r--. 1 root zg1 0 Dec 17 22:34 t1
    $ echo 111 >> ./t1
    ./t1: Permission denied.
    $ rm -f t1
    $ ll
    total 0
    

    四,创建文件或者目录后,文件和目录的mode是如何计算出来的。

    由umask决定。假如umask是0022(----w--w-),则:

    生成文件的mode:rw-rw-rw(666) - umask(----w--w-) = rw-r--r--

    生成目录的mode:rwxrwxrwx(777) - umask(----w--w-) = rwxr-xr-x

    • umask获取当前的umask值
    • umask mode设置umask,但只在当前shell中有效

    参考:Linux umask详解:令新建文件和目录拥有默认权限

    五,拷贝文件时,能否同时指定目标文件的mode和ownership?创建目录的同时,能否同时指定目录的mode和ownership?

    cp命令是做不到的,install命令可以做到,但是install不能拷贝目录。

    mkdir命令是做不到的,install命令可以做到。

    install后,目标文件或者目录的mode的默认值都是755

    • 指定目标的mode:-m mode

    • 指定目标的user:-o username

    • 指定目标的group:-g groupname

    • 拷贝单个文件,到文件

      # ll /etc/inittab
      -rw-r--r--. 1 root root 511 Oct 31  2018 /etc/inittab
      # install /etc/inittab f1
      # ll f1
      -rwxr-xr-x. 1 root root 511 Dec 18 14:37 f1
      # install -m 640 -o za1 -g zg1 /etc/inittab f1
      # ll f1
      -rw-r-----. 1 za1 zg1 511 Dec 18 14:38 f1
      
    • 拷贝多个文件,到目录

      # mkdir d1
      # ll d1
      total 0
      # install -m 754 -o gentoo -g zg1 /etc/inittab /etc/issue d1/
      # ll d1
      -rwxr-xr--. 1 gentoo zg1 511 Dec 18 14:43 inittab
      -rwxr-xr--. 1 gentoo zg1  23 Dec 18 14:43 issue
      
    • 创建目录

      # install -m 711 -o za1 -g zg1 -d d3
      # ll -d d3
      drwx--x--x. 2 za1 zg1 6 Dec 18 14:27 d3
      

    六,创建文件名或者目录名是,随机的临时文件,而且名称不重复:mktemp

    • 语法:mktemp [OPTION]... tmp.XXXXXXXXXX

    • 创建名称是随机的文件:不使用任何选项

      # mktemp file.XXX
      file.fPA
      # mktemp file.XXX
      file.8Ir
      
    • 创建名称是随机的目录:使用选项-d

      # mktemp -d dir.XXXX
      dir.Cq5N
      # mktemp -d dir.XXXX
      dir.O9Bm
      # ll -d dir.Cq5N/
      drwx------. 2 root root 6 Dec 18 15:06 dir.Cq5N/
      # ll -d dir.O9Bm/
      drwx------. 2 root root 6 Dec 18 15:06 dir.O9Bm/
      
    • 只产生随机的名称,而不创建文件或者目录:使用选项-u

      # mktemp -u 111.XXX
      111.hrM
      # ll 111.hrM
      ls: cannot access 111.hrM: No such file or directory
      # mktemp -ud 111.XXX
      111.evP
      # ll 111.evP
      ls: cannot access 111.evP: No such file or directory
      
    • 把创建的文件或目录放在/tmp目录:使用选项-t

      # pwd
      /root
      # mktemp -t 222.XXX.XXX
      /tmp/222.XXX.rcm
      # mktemp -t 222.XXX.XXX
      /tmp/222.XXX.mA1
      
    • 用变量保存生成的名称。

      # echo $myfile
      
      # myfile=$(mktemp -t abc.XXX)
      # echo $myfile
      /tmp/abc.YEx
      ll /tmp/abc.YEx
      -rw-------. 1 root root 0 Dec 18 15:14 /tmp/abc.YEx
      
    • 使用mktemp生成的,文件的mode是600;目录的mode是700

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    ubuntu 安装QT 5.0出现错误:Failed to load platform plugin "xcb".
    Ubuntu手动编译GCC
    C++面试题集锦(一)
    C++排序系列(一) 插入排序之折半插入排序
    关于内存对齐的面试题
    C++中的static_cast, dynamic_cast和reinterpret_cast
    C++排序系列(二) 交换排序之简单排序
    Cannot open include file: 'iphlpapi.h': No such file or directory(最终解决方法)
    C++排序系列(一) 插入排序之直接插入排序
    ubuntu aptget update时出现W: GPG 错误
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/12060159.html
Copyright © 2011-2022 走看看