欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux 权限管理

程序员文章站 2022-06-05 17:22:07
Linux下一切都被抽象成了file,哪些进程可以访问哪些file,不可以访问哪些file,就是权限管理。 每个file都有权限属性,可以用 查看file的权限属性。 3对rwx分别代表,用户,组,其他人的rwx。 file通过自己的权限属性来保护自己,让符合自己权限属性的进程访问,让不符合自己权限 ......
  • 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

Linux 权限管理

本人微信:xiaoshitou5854