10 Linux实操篇-组管理和权限管理

10 Linux实操篇-组管理和权限管理

文章目录

  • [10 Linux实操篇-组管理和权限管理](#10 Linux实操篇-组管理和权限管理)
    • [10.1 Linux组管理](#10.1 Linux组管理)
      • [10.1.1 Linux组基本介绍](#10.1.1 Linux组基本介绍)
      • [10.1.2 所有者-修改```chown```](#10.1.2 所有者-修改chown)
      • [10.1.3 所在组-修改```chgrp```](#10.1.3 所在组-修改chgrp)
      • [10.1.4 其他组](#10.1.4 其他组)
    • [10.2 Linux权限管理](#10.2 Linux权限管理)
      • [10.2.1 rwx权限详解](#10.2.1 rwx权限详解)
      • [10.2.2 修改权限-```chmod```](#10.2.2 修改权限-chmod)
      • [10.2.3 课后练习-疯狂动物城](#10.2.3 课后练习-疯狂动物城)
  1. 《鸟哥的Linux私房菜 基础学习篇 第四版》[1](#1)
  2. 《鸟哥的Linux私房菜 服务器架设篇 第三版》[2](#2)
  3. 《韩顺平_2021图解Linux全面升级》[3](#3)

这个章节是比较重要的,并且理解起来有一点难度。

10.1 Linux组管理

10.1.1 Linux组基本介绍

在"第8章 用户管理"已经介绍过"用户组"的相关概念(详见8.6节),本小节继续深入介绍文件/目录的"所有者"、"所在组"、"其他组"。在Linux中的每个用户必须属于一个组,不能独立于组外,就像现实生活中每个人都有国籍一样。创建新用户时可以指定将该用户添加到哪个组中;若不特别指定其所在组,系统会默认创建一个同名组,将该用户放进去。当然,用root的管理权限可以改变某个用户所在的组:

shell 复制代码
# 基本语法-改变用户所在组
usermod -g 新组名 用户名

# 基本语法-改变用户登录的初始目录
usermod -d 目录名 用户名    # 注意用户需要有进入到新目录的权限!!

组1 所有者 创建 所在组 其他组 其他组 组... ... ... ... 组2 milan king ... tom jack ... a.txt
图10-1 文件的所有者、所在组、其他组

既然用户会属于某个组,那每个文件也就相应有了"所有者"、"所在组"、"其他组"的概念,上图就较为形象的画出了它们的关系。如上图所示,用户tom创建了一个文件a.txt,那么++a.txt的"所有者"++ 就默认是tom,当然也可以改成其他的"所有者"。而tom所在的组就默认是++a.txt的"所在组"++ ,该组内的所有成员对该文件享有权限A;Linux下所有其他的组都是++a.txt的"其他组"++,"其他组"中的用户对该文件享有权限B。这里的"权限A"、"权限B"都是笼统概念,表示权限不同,后面还会详细介绍。

10.1.2 所有者-修改chown

"所有者"一般为文件/目录的创建者,谁创建了该文件/目录,就自然的成为该文件/目录的所有者。下面是查看和修改文件/目录的"所有者"的基本语法:

shell 复制代码
# 基本语法-查看文件/目录的所有者
ls -ahl


# 基本语法-修改文件/目录所有者
chown 新的所有者 文件/目录              # 修改所有者
chown 新的所有者:新的所在组 文件/目录    # 修改所有者和所在组

# 常用选项-chown
-R  如果是目录,则使其下所有子文件或目录递归生效

下面展示三个应用案例,前两个查看"所有者"、后两个修改"所有者"【以文件举例,目录同理】:

shell 复制代码
# 【案例1-查看所有者】使用root创建文件/home/a.txt,并查看其所有者。
[root@CentOS76 ~]# cd /home
[root@CentOS76 home]# touch a.txt
[root@CentOS76 home]# ls -ahl
总用量 32K
drwxr-xr-x.  8 root  root   4.0K 7月  20 11:10 .
dr-xr-xr-x. 18 root  root   4.0K 7月  13 17:12 ..
-rw-r--r--.  1 root  root      0 7月  20 11:09 a.txt
drwx------.  3 jack  jack   4.0K 7月  20 11:09 jack
drwx------.  3 king  king   4.0K 7月  20 11:09 king
drwx------. 15 lyl   lyl    4.0K 7月  13 17:38 lyl
drwx------.  3 milan milan  4.0K 7月  20 11:09 milan
drwx------.  3 tom   tom    4.0K 7月  20 11:08 tom
drwx------.  3 zwj   wudang 4.0K 7月  20 11:10 zwj
# 上面第三列就是每个文件的所有者


# 【案例2-查看所有者】将上述/home/a.txt的所有者改成tom。
[root@CentOS76 home]# chown tom a.txt 
[root@CentOS76 home]# ls -ahl
总用量 32K
drwxr-xr-x.  8 root  root   4.0K 7月  20 11:10 .
dr-xr-xr-x. 18 root  root   4.0K 7月  13 17:12 ..
-rw-r--r--.  1 tom   root      0 7月  20 11:09 a.txt
drwx------.  3 jack  jack   4.0K 7月  20 11:09 jack
drwx------.  3 king  king   4.0K 7月  20 11:09 king
drwx------. 15 lyl   lyl    4.0K 7月  13 17:38 lyl
drwx------.  3 milan milan  4.0K 7月  20 11:09 milan
drwx------.  3 tom   tom    4.0K 7月  20 11:08 tom
drwx------.  3 zwj   wudang 4.0K 7月  20 11:10 zwj


# 【案例3-修改所有者】新建/home/kkk目录,并将kkk目录下所有的文件和目录的所有者和所在组都修改成tom。
[root@CentOS76 home]# mkdir kkk
[root@CentOS76 home]# touch ./kkk/a.txt
[root@CentOS76 home]# touch ./kkk/b.txt
[root@CentOS76 home]# ll kkk
总用量 0
-rw-r--r--. 1 root root 0 7月  21 11:35 a.txt
-rw-r--r--. 1 root root 0 7月  21 11:35 b.txt
[root@CentOS76 home]# chown -R tom:tom kkk
[root@CentOS76 home]# ll kkk
总用量 0
-rw-r--r--. 1 tom tom 0 7月  21 11:35 a.txt
-rw-r--r--. 1 tom tom 0 7月  21 11:35 b.txt

注意下面这个案例是我将虚拟机状态恢复成最开始的样子,再重新创建所有用户。第一个重复的是我没有恢复之前,该虚拟的样子,我怀疑让我玩出了严重的bug。

shell 复制代码
[root@CentOS76 home]# cd /home
[root@CentOS76 home]# touch a.txt
[root@CentOS76 home]# ls -ahl
总用量 36K
drwxr-xr-x.  9 root  root   4.0K 7月  20 10:43 .
dr-xr-xr-x. 18 root  root   4.0K 7月  17 11:49 ..
-rw-r--r--.  1 root  root      0 7月  20 10:43 a.txt
drwx------.  3 tom   a      4.0K 7月  15 15:49 jack
drwx------.  5 jerry jerry  4.0K 7月  16 16:31 jerry
drwx------.  3 milan jerry  4.0K 7月  15 15:50 king
drwx------. 15 lyl   lyl    4.0K 7月  15 10:59 lyl
drwx------.  5 zwj   wudang 4.0K 7月  15 12:12 milan
drwx------.  3 zwj   a      4.0K 7月  15 15:08 tom
drwx------.  3 jerry   1009 4.0K 7月  16 10:35 zwj
# 上面第三列就是每个文件的所有者

10.1.3 所在组-修改chgrp

那显然,当某个用户创建了一个文件/目录后,该用户所在的组就是这个文件/目录的"所在组"。下面是查看和修改文件/目录的"所在组"的基本语法:

shell 复制代码
# 基本语法-查看文件/目录所在组
ls -ahl

# 基本语法-修改文件/目录所在的组
chgrp 新的所在组 文件/目录      # 修改所在组

# 常用选项-chgrp
-R  如果是目录,则使其下所有子文件或目录递归生效

下面展示三个应用案例【以文件举例,目录同理】:

提示:老韩演示【案例1】【案例2】都是直接Xshell退出重新登陆,而不是直接su - 用户名跳转。

shell 复制代码
# 【案例1-查看所在组】fox登录,创建文件/home/ok.txt,查看其所在组。
[fox@CentOS76 ~]$ pwd
/home/fox
[fox@CentOS76 ~]$ touch ok.txt
[fox@CentOS76 ~]$ ls
ok.txt
[fox@CentOS76 ~]$ ll
总用量 0
-rw-r--r--. 1 fox monster 0 7月  20 11:43 ok.txt
# 上述第三列表示所有者是fox,第四列表示所在组是monster。


# 【案例2-修改所在组】root登录,新建fruit组,并将上述/home/fox/ok.txt文件的所在组修改到fruit组。
[root@CentOS76 ~]# groupadd fruit
[root@CentOS76 ~]# chgrp fruit /home/fox/ok.txt 
[root@CentOS76 ~]# ll /home/fox
总用量 0
-rw-r--r--. 1 fox fruit 0 7月  20 11:43 ok.txt


# 【案例3-修改所在组】root登录,创建/home/kkk目录,并将其下所有的文件和目录的所在组都修改成shaolin(少林)。
[root@CentOS76 home]# mkdir kkk
[root@CentOS76 home]# touch ./kkk/a.txt
[root@CentOS76 home]# touch ./kkk/b.txt
[root@CentOS76 home]# ll kkk
总用量 0
-rw-r--r--. 1 root root 0 7月  21 11:58 a.txt
-rw-r--r--. 1 root root 0 7月  21 11:58 b.txt
[root@CentOS76 home]# chgrp -R shaolin kkk
[root@CentOS76 home]# ll
总用量 32
drwxr-xr-x.  2 root  shaolin 4096 7月  21 11:58 kkk
# 其余的文件/目录就不展示了
[root@CentOS76 home]# ll kkk
总用量 0
-rw-r--r--. 1 root shaolin 0 7月  21 11:58 a.txt
-rw-r--r--. 1 root shaolin 0 7月  21 11:58 b.txt

10.1.4 其他组

除文件/目录的"所有者"和"所在组"的用户外,系统的其它用户都是文件/目录的其它组。

10.2 Linux权限管理

10.2.1 rwx权限详解

权限的使用在Linux中是一个重点,相对来说也是一个难点。在10.1节中提到,文件的"当前组"和"其他组"中的成员对该文件享有不同的权限。那Linux中一共有几种权限呢,又是怎么分配的呢?本节就来介绍。比如下面登录root账户创建/home/a.txt文件并写入6个字符------"hello~",然后使用ll查看文件列表,如下:

shell 复制代码
[root@CentOS76 home]# touch a.txt
[root@CentOS76 home]# echo "hello~" >> a.txt
[root@CentOS76 home]# ll
总用量 48
-rw-r--r--.  1 root  root       7 7月  21 19:05 a.txt
drwx------.  5 fox   monster 4096 7月  22 09:31 fox
drwx------.  3 jack  jack    4096 7月  20 11:09 jack
drwxrwxr-x.  5 judy  police  4096 7月  21 17:05 judy
drwx------.  3 king  king    4096 7月  20 11:09 king
drwx------. 15 lyl   lyl     4096 7月  13 17:38 lyl
drwx------.  3 milan milan   4096 7月  20 11:09 milan
lrwxrwxrwx.  1 root  root       5 7月  22 09:55 myroot -> /root
drwx------.  3 nick  police  4096 7月  21 16:21 nick
drwx------.  5 sheep bandit  4096 7月  21 17:05 sheep
drwx------.  5 tom   tom     4096 7月  21 11:06 tom
drwx------.  5 wolf  police  4096 7月  21 17:05 wolf
drwx------.  3 zwj   mojiao  4096 7月  20 11:10 zwj

下面就以上述第一行的a.txt为例,来具体说明每一列的含义:

  • 【第1列】10个字符:确定不同用户对该文件的权限。其中第一个字符代表文件类型(常见的有-,b,c,d,l)。其余字符9个字符,每3个一组(rwx)分别代表了该文件的"所有者"、"所在组"的其他用户、"其他组"的所有用户对该文件的读®、写(w)、执行(x)权限。
  • 【第0位】:确定文件类型(常见的有-,b,c,d,l)。

-是普通文件;b是块设备,如/dev目录下的硬盘;c是字符设备文件,如/dev目录下的鼠标、键盘等;d是目录,相当于windows的文件夹;l是链接,相当于windows的快捷方式;。

  • 【第1,2,3位】:++"所有者"++对该文件的rwx权限。---User
  • 【第4,5,6位】:++"所在组"的其他用户++对该文件的rwx权限。---Group
  • 【第7,8,9位】:++"其他组"的所有用户++对该文件的rwx权限。---Other
  • 【第2列】1:表示文件的"硬连接数",或者是目录的"子目录数+文件数"。此例中a.txt是一个普通文件,所以为1。
  • 【第3列】root:文件所有者。此例中a.txt的所有者显然是root用户。
  • 【第4列】root:文件所在组。此例中a.txt的所在组显然是root用户的同名组root。
  • 【第5列】7:若为文件,则显示该文件的字节总数(单位:Byte);若为文件夹,则固定显示4096。此例中虽然只向a.txt中写入了6个字符"hello~",但是其文档末尾会自动添加一个字符串结束标志\0,所以一共是7个字符。
  • 【第6,7,8列】7月 21 19:05:该文件/目录的最后修改日期。
  • 【第9列】a.txt:文件/目录名。

那到底什么是rwx权限呢?下面就来进行rwx权限详解【难点】。Linux中"文件"和"目录"的rwx权限有不同的含义:

文件的rwx权限:

  1. r】:可以读取、查看该文件。
  2. w】:代表可写(write):可以修改,但是不代表可以删除该文件。删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件。
  3. x 】:代表可执行(execute):表示系统可以使用./文件名执行该文件。比如在一个有执行权限的文件a.txt中写入ls -al,然后直接在终端输入./a.txt,那么该指令就会被相应的执行。
  4. -】:表示没有相应的权限。

目录的rwx权限:

  1. r 】:代表可读(read):表示可以读取该目录的文件列表,比如使用ls指令。
  2. w】:代表可写(write):表示可以修改该目录的文件列表,也就是删除、创建、重命名其下的目录/文件。
  3. x 】:代表可执行(execute):++表示可以进入该目录,这和文件的x权限非常不同++。如果仅有x权限,也可以读写那些有读写权限的文件,但就像摸黑找东西,全靠记忆力。
  4. -】:表示没有相应的权限。

a.txt:所以-rw-r--r--就表示a.txt是一个普通文件,"所有者"享有"读"、"写"权限不能"执行","所在组"的其他用户只享有"读"权限,"其他组"的所有用户也只享有"读"权限。
注:在Linux中使用BCD8421码表示相应的权限:r=4, w=2, x=1。因此使用数字0~7就可以表示任意组合的权限。

10.2.2 修改权限-chmod

那通过上面的说明可以看出,一个文件/目录刚被创建好是都分配有默认权限,但有时候这个权限不合适,比如我想要"所在组"的所有用户都拥有对该文件的rw权限,这时候就需要用到chmod指令来修改权限。下面介绍两种使用chmod的方式,并给出一些例子:

shell 复制代码
# 基本语法-chmod
# 【方式一】+、-、=变更权限,u:所有者 g:所有组 o:其他人 a:所有人(u、g、o的总和)
chmod u=rwx,g=rx,o=x 文件/目录名    # 给文件/目录的u用户rwx权限、g用户rx权限、o用户x权限
chmod o+w 文件/目录名               # 给文件/目录的o用户添加w权限
chmod a-x 文件/目录名               # 剥夺文件/目录的a用户的x权限

# 【方式二】r=4,w=2,x=1
chmod 751 文件/目录名    # 等价于chmod u=rwx,g=rx,o=x 文件/目录名

下面展示四个应用实例:

【案例1-使用±=】给abc文件的所有者读/写/执行的权限,给所在组读/执行权限,给其它组读/执行权限。

shell 复制代码
[root@CentOS76 home]# touch abc
[root@CentOS76 home]# chmod a-rwx abc
[root@CentOS76 home]# ll
总用量 28
----------.  1 root  root       0 7月  21 11:15 abc
# 其余的文件/目录就不展示了

[root@CentOS76 home]# chmod u=rwx,g=rx,o=rx abc
[root@CentOS76 home]# ll
总用量 28
-rwxr-xr-x.  1 root  root       0 7月  21 11:15 abc
# 其余的文件/目录就不展示了

【案例2-使用±=】给abc文件的所有者除去执行的权限,增加组写的权限。

shell 复制代码
[root@CentOS76 home]# chmod u-x,g+w abc
[root@CentOS76 home]# ll
总用量 28
-rw-rwxr-x.  1 root  root       0 7月  21 11:15 abc
# 其余的文件/目录就不展示了

【案例3-使用±=】给abc文件的所有用户添加读的权限。

shell 复制代码
[root@CentOS76 home]# chmod a+r abc
[root@CentOS76 home]# ll
总用量 28
-rw-rwxr-x.  1 root  root       0 7月  21 11:15 abc
# 其余的文件/目录就不展示了

【案例4-使用数字】给abc文件的权限修改成---------rwxr-xr-x

shell 复制代码
[root@CentOS76 home]# chmod 000 abc
[root@CentOS76 home]# ll
总用量 28
----------.  1 root  root       0 7月  21 11:15 abc
# 其余的文件/目录就不展示了

[root@CentOS76 home]# chmod 755 abc
[root@CentOS76 home]# ll
总用量 28
-rwxr-xr-x.  1 root  root       0 7月  21 11:15 abc
# 其余的文件/目录就不展示了

10.2.3 课后练习-疯狂动物城

Linux系统 police bandit sheep wolf nick judy
图10-2 案例的分组示意图

本小节以《疯狂动物城》为背景,演示如何改变用户的所在组、修改文件的权限。具体进行如下操作:

  1. 创建两个组(police,bandit)、两个警察用户(nick,judy)、两个土匪用户(sheep,wolf),它们的分组关系如上图。
  2. root登录,记录wolf已投靠警察。
  3. judy登录,创建文件judy.txt,设置权限为自己可以读写,本组人可以读写,其它组的用户只能读。
  4. wolf登录,验证同组人可以进行读写。
  5. sheep登录,验证其他组的人只能读。
shell 复制代码
# 1.root登录,创建组和用户,并设置所有用户的密码与用户名相同。
[root@CentOS76 home]# groupadd police
[root@CentOS76 home]# groupadd bandit
[root@CentOS76 home]# useradd -g police nick
[root@CentOS76 home]# useradd -g police judy
[root@CentOS76 home]# useradd -g bandit sheep
[root@CentOS76 home]# useradd -g bandit wolf
[root@CentOS76 home]# passwd judy
更改用户 judy 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS76 home]# passwd nick
更改用户 nick 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS76 home]# passwd sheep
更改用户 sheep 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS76 home]# passwd wolf
更改用户 wolf 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。


# 2.root登录,标记wolf已投靠警察
[root@CentOS76 ~]# id wolf
uid=1010(wolf) gid=1011(bandit) 组=1011(bandit)
[root@CentOS76 ~]# usermod -g police wolf
[root@CentOS76 ~]# id wolf
uid=1010(wolf) gid=1010(police) 组=1010(police)


# 3.judy登录,创建文件/home/judy/judy.txt,设置权限为自己可以读写,本组人可以读写,其它组的用户只能读。
[judy@CentOS76 ~]$ touch judy.txt
[judy@CentOS76 ~]$ ll
总用量 0
-rw-r--r--. 1 judy police 0 7月  21 16:26 judy.txt
[judy@CentOS76 ~]$ chmod g=rw,o=r judy.txt          # 修改文件权限
[judy@CentOS76 ~]$ ll
总用量 0
-rw-rw-r--. 1 judy police 0 7月  21 16:26 judy.txt
[judy@CentOS76 ~]$ chmod g=rwx,o=rx /home/judy      # 修改目录权限
[judy@CentOS76 ~]$ ll /home
总用量 44
drwxrwxr-x.  5 judy  police  4096 7月  21 16:26 judy
# /home中其他的目录/文件就不显示了。
# 注意目录权限也要更改,否则当前组的其他成员也无法访问文件夹。


# 4.wolf登录,发现可以对judy.txt进行读写。
[wolf@CentOS76 ~]$ ll /home/judy
总用量 0
-rw-rw-r--. 1 judy police 0 7月  21 16:26 judy.txt
[wolf@CentOS76 ~]$ vim /home/judy/judy.txt 
[wolf@CentOS76 ~]$ echo "i am wolf" >> /home/judy/judy.txt 
[wolf@CentOS76 ~]$ cat /home/judy/judy.txt 
i am wolf


# 5.sheep登录,只能读不能写。
[sheep@CentOS76 ~]$ ll /home/judy
总用量 4
-rw-rw-r--. 1 judy police 10 7月  21 16:57 judy.txt
[sheep@CentOS76 ~]$ echo "i am sheep" >> /home/judy/judy.txt 
-bash: /home/judy/judy.txt: 权限不够
[sheep@CentOS76 ~]$ cat /home/judy/judy.txt 
i am wolf

结论:

  1. 若想对某个目录的文件进行读、写等操作,需要首先有对该目录的执行权限。
  2. 至少需要给目录读、执行两个权限,才能使得其他用户进入并查看该目录。
  3. Xshell在用户登录时会检测其环境变量(也就是所在组等设置),若root用户修改了某用户的所在组,最简单的方法就是重新登录该用户,就能检测到所在组的变化。

  1. 《鸟哥的Linux私房菜 基础学习篇 第四版》 ↩︎

  2. 《鸟哥的Linux私房菜 服务器架设篇 第三版》 ↩︎

  3. 《韩顺平_2021图解Linux全面升级》 ↩︎

相关推荐
小田冲冲冲39 分钟前
搭建域服务器
运维·服务器
亦安✘42 分钟前
服务器从0到1微服务所需的环境的安装
运维·服务器·spring cloud·微服务
taxunjishu2 小时前
ProfiNet 转 Ethernet/IP基于西门子 S7 - 1500 与罗克韦尔 PLC 的汽车零部件加工线协同案例
运维·人工智能·物联网·自动化·区块链
用户51681661458412 小时前
[VMware 无法检测此光盘中映像中的操作系统] VMware创建虚拟机无法检测操作系统iso镜像文件
linux·前端
MacroZheng2 小时前
斩获 7.8K star!一款堪称开源监控新标杆的项目,牛皮!
java·linux·后端
YC运维2 小时前
Ansible模块
java·服务器·前端
博语小屋3 小时前
程序(进程)地址空间(1)
linux
yunyi3 小时前
使用acme.sh来实现自动化申请和续订TLS证书
linux·nginx·docker
包达叔3 小时前
docker国内镜像源
运维·docker·容器
未来可期LJ3 小时前
【Linux 小实战】自定义 Shell 的编写
linux·服务器