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^
  2. 《鸟哥的Linux私房菜 服务器架设篇 第三版》^2^
  3. 《韩顺平_2021图解Linux全面升级》^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全面升级》 ↩︎

相关推荐
YRr YRr26 分钟前
ubuntu ros 解决建完图后 保存的地图非常小的问题
linux·运维·ubuntu
汤米粥39 分钟前
怎么样绑定域名到AWS(亚马逊云)服务器
服务器·云计算·aws
脸ル粉嘟嘟1 小时前
常用命令之Linux&Oracle&Hive&Python
linux·hive·oracle
Wils0nEdwards1 小时前
Leetcode 整数转罗马数字
linux·python·leetcode
写bug的小屁孩1 小时前
websocket初始化
服务器·开发语言·网络·c++·websocket·网络协议·qt creator
石牌桥网管2 小时前
DNS Resolver解析服务器出口IP查询
运维·网络·tcp/ip·dns
LKAI.2 小时前
华为路由策略配置
运维·网络·华为·智能路由器
IpdataCloud2 小时前
IP数据云 识别和分析tor、proxy等各类型代理
运维·服务器
五味香2 小时前
Linux学习,ip 命令
linux·服务器·c语言·开发语言·git·学习·tcp/ip