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

警告
本文最后更新于 2023-10-23,文中内容可能已过时。

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

这一章的重点就是chownchgrpchmod三个命令。

chown确定文件的所有者,然后文件所有者控制文件的组和文件的权限

Linux 组基本介绍

在 linux 中的每个用户必须属于一个组,不能独立于组外。在 Linux 中每个文件有所有者、所在组、其它组的概念。

具体命令回看《Linux 实操篇 - 用户管理》的用户组小节

文件/目录所有者

查看文件的所有者

ll命令即可查看。

ll中展示的文件所有者,和文件所属的组,是两个独立的东西,文件的所有者所在的组和文件所属的组,不一定相同。只有在文件刚创建的时候,文件所有者就是创建文件的用户,文件所在组就是文件创建者所在的组

因此,ll中展示的权限中的第二部分同组者的权限,指的是文件所在组的同组者,而不是文件所有者所在组的同组者

其实这样挺好,文件的权限可以独立地用组进行控制,和文件创建者绑定在一起,反而不灵活。

修改文件所有者

root 创建的文件,放到用户 lk 的家目录,lk 登录之后查看文件的时候,会发现

此文件是只读的,lk 用户属于 root 用户的其他组用户,对应 r-- 这一段权限,所以 lk 是只读的。

重新登录 root 用户,然后使用chown命令把文件的所有者改成 lk(只有 root 用户才可以使用chown修改文件所有者),再登录 lk 查看,文件权限没有变,但是此时,lk 成为了文件的所有者,对应 rw- 这一段权限,用 vim 编辑确实也证实文件可修改

把文件拥有者修改为 lk:chown lk /home/lk/rootcreate.txt

组的创建

回看《Linux 实操篇 - 用户管理》的用户组小节

文件/目录所在组

当某个用户创建了一个文件后,这个文件的所有这就是当前用户,而且这个文件的所在组就是该用户所在的组。

查看文件/目录所在组

通过ll命令即可查看,《ls 指令 list files》

修改文件/目录所在的组

使用chgrp命令

其它组

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

改变用户所在组

回看《Linux 实操篇 - 用户管理》的用户组小节

权限的基本介绍

回看ll命令的解析,回看《ls 指令 list files》

rwx权限详解,难点

回看ll命令的解析,回看《ls 指令 list files》

文件及目录权限实际案例

回看ll命令的解析,回看《ls 指令 list files》

修改文件所有者 - chown

Linux chown(英文全拼:change owner)命令用于设置文件所有者和文件关联组的命令。

Linux/Unix 是多人多工操作系统,所有的文件皆有拥有者利用 chown 将指定文件的拥有者和组改为指定的用户和组,用户可以是用户名或者用户 ID,组可以是组名或者组 ID,文件是以空格分开的要改变权限的文件列表,支持通配符。(这就很棒了)

chown需要超级用户 root 的权限才能执行此命令(这也很好理解,一般用户没有权限来改变别人的文件的拥有者,也没有权限可以将自己的文件的拥有者改设为别人)

1
chown [-cfhvR] [--help] [--version] user[:group] file...

简单实践:

chown userid file...:修改文件所有者

chown userid folder...:修改目录所有者

chown :groupid file...:修改文件所在组

chown userid: groupid file...:同时修改文件所有者和组

chown -R userid: groupid folder/:如果想一次性处理目录同时目录下有子目录,带上 -R 参数

修改文件/目录所在组 - chgrp

Linux chgrp(英文全拼:change group)命令用于变更文件或目录的所属群组。与 chown 命令不同,chgrp允许普通用户改变文件所属的组,只要该用户是文件所有者同时是目标组的一员(The owner of a file may change the group of the file to any group of which that owner is a member),或者是 root,就可以运行 chgrp。在 UNIX 系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用 chgrp 指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。

1
2
chgrp [-cfhRv][--help][--version][所属群组][文件或目录...]
chgrp [-cfhRv][--help][--reference=<参考文件或目录>][--version][文件或目录...]
  • -R--recursive:递归处理,将指定目录下的所有文件及子目录一并处理。

  • --reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。

简单实践:

chgrp groupid /opt/rootcreate.txt:修改单个文件的权限

chgrp groupid /opt/testfolder:修改单个目录的权限

chgrp -R groupid folerPer/:修改递归目录的权限

chgrp --reference aaa.txt permTxt.sh:使用参考文件修改文件所在组,前提是操作者必须是文件所有者同时也是参考文件所在组即目标组的成员

修改权限 - chmod

Linux chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令,权限的基础知识查看《ls 指令 list files》

只有文件的所有者和 root 用户才可以修改文件的权限,其他人都不行。这是很正确的,如果任何人都可以对一个文件设置权限,那这个权限不就毫无意义了吗?

1
chmod [-cfvR] [--help] [--version] <mode> file...
  • -c : 若该文件权限确实已经更改,才显示其更改动作

  • -f : 若该文件权限无法被更改也不要显示错误讯息

  • -v : 显示权限变更的详细资料

  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更 (即以递归的方式逐个变更),常用,例如,chmod -R a=rwx testfolder/

  • --help: : 显示辅助说明

  • --version : 显示版本

常用配置项:除了 -R,其他用的都不多

其中 mode 为权限设定字串,可以理解为权限的表达式,这是chmod命令的重点

1
[ugoa...][[+-=][-rwxstX]...][,...]

使用符号模式可以设置多个项目,一个部分由 who(用户类型:ugoa),operator(操作符:+-=)和 permission(权限:-rwxstX)组成,每个部分的设置可以用逗号隔开。命令 chmod 将修改 who 指定的用户类型对文件的访问权限,用户类型由一个或者多个字母在 who 的位置来说明,这个位置为空表示 a(所有用户),一个chomod命令的多个部分中的 who 可以重叠,也就是说一个chomod命令可以对一个用户类型进行多次设置,permission 也可以同时指定多个权限。这个位置为空表示-,没有权限

  • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体 (group) 者,o 表示其他以外的人,a 表示这三者皆是。

  • + 表示增加权限、- 表示取消权限、= 表示准确地设定权限。

  • - 就是没有权限,空权限占位符,r 表示可读取,w 表示可写入,x 表示可执行,s、t 权限,看《ls 指令 list files》,这里不重复,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行(X 与 rwxst 不同,并不是真正意义的标识,而是 chmod 的一种行为,就是当文件是目录或对任意用户有执行权限的情况下,才设置执行权限位,即此时等价于 x,否则不改变执行权限。后半句怎么理解呢,就是 ugo 没有一个对其由 x 权限的时候,给文件加上 X 权限是没有效果的,如果 ugo 其中有一个对此文件由 x 权限,比如 u 为 rwx,这个时候给o+X,就会设置 o 有执行权限,就是不知道啥使用场景 TODO)。

刚创建的一个 txt 文件的时候,默认的权限是 -rw-r--r--。数字是 644

简单实践:

chmod =rw filename.txt:设置文件的所有角色权限为 rw

chmod =rw testfolder:设置文件夹的所有角色权限为 rw

chmod o= filename.txt:设置文件的 o 权限为空

chmod = filename.txt:设置文件的所有角色权限为空

chmod o=--- filename.txt:设置文件的 other 的权限为空

chmod u+x,g-x,o-w filename.txt:所有者添加执行权限,同组者删除执行权限,其他人删除编辑权限

多个项目之间的 who 可以重叠

比如chmod a+x,g-x filename.txt甚至直接重复chmod a+x,a-x filename.txtchmod u+w,u-w filename.txt

chmod a+r file1.txt:所有人添加读取权限

chmod ug+wx filename.txt:所有者和同组者添加编辑和执行的权限

chmod -R u=rwx testfolder/:为 testfolder 目录下所有的文件的所有者准确设置为对此文件可查看可编辑可执行

find path/ -type d -exec chmod a+x {} \;:允许所有用户执行目录path/下的文件

用八进制语法表示权限

八进制语法(一个三位二进制数就是一个八进制数)

其中当你想快速精确设置权限的时候,可以使用数字参数。用数字表示为:r=4w=2x=1,因此rwx=4+2+1=7,数字可以进行组合,这样从 1 到 7 的这几个数字就代表了这三个字母组成的权限也就是某一个角色的权限,其实可以把 rwx 也就是每一个角色的权限理解为一个三位二进制数,这样更好记忆

  • 0(二进制)对应 000(八进制)对应 ---

  • 1(二进制)对应 001(八进制)对应 --x

  • 2(二进制)对应 010(八进制)对应 -w-

  • 3(二进制)对应 011(八进制)对应 -wx

  • 4(二进制)对应 100(八进制)对应 r--

  • 5(二进制)对应 101(八进制)对应 r-x

  • 6(二进制)对应 110(八进制)对应 rw-

  • 7(二进制)对应 111(八进制)对应 rwx

完整的权限就是三个这样的三位二进制数的组合

例子:

chmod 000 filename.txt:所有角色都没有权限

chmod 777 filename.txt:所有角色都有 rwx 权限

chmod 754 filename.txt:等价于 u=rwx,g=r-x,o=r--

缺点就是每个角色的权限都得设置一遍,不然通过符号设置权限更加灵活和可读,

0%