说明:文章部分内容源自网络,仅作交流学习使用,如构成侵权请私聊
参考资料:《鸟哥的Linux私房菜第四版》《Linux操作系统(微课版)(RHEL8CentOS8)(第2版)》《菜鸟教程》
测试系统:RHEL 8.2
如果文章有错误之处欢迎大家批评指正
概述
其实权限管理和用户组管理本应该放在一起说明的,但是为了避免单篇的篇幅过长,故分开进行讨论。
在深入学习一个知识点的时候,我会更倾向于了解这个知识点的作用,否则的话学习起来是毫无兴趣的,那么在Linux里面为什么需要权限管理呢?我个人认为主要有以下两个方面的原因:
一、处于系统安全考虑
例如在上一篇内容提到的用户口令存储位置,其实用户的口令在一开始是存储在/etc/passwd里面的,但是/etc/passwd文件对于所有用户都有可读的权限,并不是那么安全。所以目前大多收的Linux系统都将口令存放在/etc/shadow里面了。
同时,在Linux里面可以登录的用户被分为两种类型,root用户和普通用户。root用户拥有操作系统的全部权限,给所有人root权限,显然也不太现实。
etc/passwd文件权限
etc/shadow文件权限
二、出于工作协同的考虑
Linux系统一般是部署在企业的服务器之上的,并不像个人PC一样只有你自己使用。比如在做软件开发的时候可能会用到协同工作软件SVN。因此就必须针对协同工作的员工设置好对应权限,避免出现某音剧情(程序员离职,删库跑路)
权限管理和用户管理之间有什么关系呢?菜鸟教程有个图片非常形象且生动,用户管理相当于对用户进行授权,权限管理相当于给了开门的权限。
图片援引自菜鸟教程(Linux 文件基本属性 | 菜鸟教程 (runoob.com)),侵删
Linux的权限类型
查看Linux权限的命令有很多,比如使用stat + 文件名,比如使用ls -l,以下我们均使用ls -l 查看文件类型。当使用ls -l 查看家目录的时候能看到以下的内容。
[root@Server01 ~]# ls -l
总用量 8
drwxr-xr-x. 2 root root 6 9月 5 18:33 公共
drwxr-xr-x. 2 root root 6 9月 5 18:33 模板
drwxr-xr-x. 2 root root 6 9月 5 18:33 视频
drwxr-xr-x. 2 root root 6 9月 5 18:33 图片
drwxr-xr-x. 2 root root 6 9月 5 18:33 文档
drwxr-xr-x. 2 root root 6 9月 5 18:33 下载
drwxr-xr-x. 2 root root 6 9月 5 18:33 音乐
drwxr-xr-x. 2 root root 6 9月 5 18:33 桌面
-rw-------. 1 root root 2032 9月 5 18:31 anaconda-ks.cfg
-rw-r--r--. 1 root root 2187 9月 5 18:32 initial-setup-ks.cfg
我们从里面随机抓取一条内容来查看以下它所代表的含义
1、文件类型(以下只列出常见文件类型)
- d 代表目录
- - 代表普通文件
- l 代表链接文件,类似于快捷方式
- b 文件里面可供存储的周边设备,可随机读取的设备
- c 输入设备,如键盘,打印机等
2、文件的权限
文件权限之于不同的用户
在Linux里面的文件权限可以分为三大类,分别是所有者(文件拥有者)权限,所属组(加入这个用户组的用户)权限和其他用户权限
在每一类用户的权限又可以被分为以下三种类型
- r (read)读权限 读取文件内容
- w(write)写权限 编辑文件内容
- x(execute)执行权限 文件具备被系统执行的权限
值得注意的是,rwx针对不同的文件有不同的含义,对应不同的命令。
rwx之于文件
在Linux里面文件指的是含有数据的地方,包括文本文件(例如使用vim file1创建的普通文本文件),数据库内容档,二进制可执行文件(例如shell脚本文件 1.sh)。
- r 读取文件内容,如使用cat查看文件内容
- w 编辑修改文件内容,如使用echo hello > file1,写入hello到file1中,但是不具备删除文件的权限,因为文件是存放在目录里面的,如果要删除文件需要有对应目录的w权限
- x 执行权限,在Windows系统中一个文件是否可以被执行通常是看文件的扩展名,如.bat,.exe等,在Linux里面一个文件是否可被执行和扩展名无关,只关心这个文件是否具有x权限,最简单的例子就是当你使用vim写了一个 “.sh” 的脚本文件之后,如果想要直接运行,必须使用 chmod + x n.sh(n为假定的文件名)才可以。而扩展名在Linux中一般只是为了方便用户明白这个文件和哪个程序关联。
rwx之于目录
在Linux中目录主要的内容是记录文件名清单,文件名和目录有强烈的关联。
- r 表示具有读取目录结构清单的权限。例如使用 “ls” 命令查看文件夹的内容
- w 表示具有更改文件目录清单的权限,例如创建新的文件、删除已经存在的文件、更改文件名、移动该目录里的文件和目录
- x 目录本身并不能被执行,因此目录的x权限一般代表能否使用 “cd ” 进入该目录
其他
有多少文件名链接到此Inode。Inode ID:每个文件都会将它的权限和属性记录到文件系统的i-node中,但是目录树是使用文件名来记录(如,使用ls -l查看的文件内容详细信息),所以每个文件名就必须链接到一个Inode ID去,有点类似于Windows的快捷方式,之于什么是Inode我们将会在下一章进行详细介绍。当你创建一个目录文件的时候这个值是2,因为目录里面有 “.” 和“..”文件,.文件链接到当前目录,.. 链接到当前目录的父目录
Time代表的是文件的最近改动时间(Modify time)或者是文件的创建时间,这个不在本章节的讨论范围之内
修改Linux的文件权限
chmod
Linux的Chmod的名利格式有以下两种类型
命令格式:chmod + {u,g,o,a} + [+,-,=] {rwx} 文件或目录名
chmod + 数字 +文件名
类型1:chmod + {u,g,o,a} + {+,-,=} {rwx} 文件或目录名
- 参数一:修改文件权限范围
- u 文件的拥有者
- g 文件所在的组
- o 除了拥有者和拥有组的其他用户
- a 所有用户 //默认选项
- 参数二:
- + 增加权限
- - 减少权限
- = 设定权限
- 参数三:具体的权限
示例:
[root@Server01 tmp]# ls -l
总用量 0
-rwxr-xr-x. 1 root root 0 11月 10 20220911 file1
[root@Server01 tmp]# chmod u-wx,g-x,o+w-x file1
[root@Server01 tmp]# ls -l
总用量 0
-r--r--rw-. 1 root root 0 11月 10 20220911 file1
类型二: chmod + 数字 +文件名
在系统的底层是采用二进制来标识文件权限的,rwx只是为了方便用户查看,一组用户的权限包括rwx三个权限,因此可以使用一组三位二进制来表示,没有任何权限可以用000来表示,转换为十进制就是0,拥有读的权限可以用100来表示,转换为十进制就是4,拥有写的权限可以用010来表示,转换为十进制就是2,拥有执行的权限可以用001来表示,转换为十进制就是1。因此当用户的所有者拥有读、写、执行的全部权限,所属组和其他用户没有权限可以使用700来表示。同理大家可以思考一下,当创建一个新的文件的时候,它的权限一般为644,当创建一个目录的时候,它的权限一般为755。
PS:chmod也可以增加上“-R”参数的参数,递归修改文件权限
示例:
[root@Server01 tmp]# ls -l
总用量 1
-r--r--rw-. 1 root root 0 9月 22 03:28 file1.
[root@Server01 tmp]# chmod 700 file1
[root@Server01 tmp]# ls -l
总用量 1
-rwx------. 1 root root 0 9月 22 03:28 file1
默认权限
新建一个文件时,这个文件的默认权限可以使用 umask 命令来查看
[root@Server01 tmp]# umask
0022
这个0022其实是权限掩码,权限掩码的第一个0代表的是特殊权限,我们先忽略,后面三位分别对应着用户的所有者、所属组、其他用户的权限。权限掩码不太方便我们进行查看,我们可以加上 -S 选项,使用文字的方式显示掩码
[root@Server01 tmp]# umask -S
u=rwx,g=rx,o=rx
[root@Server01 tmp]#
但是细心的朋友会发现,这个权限和我们创建文件的默认权限不一样,默认创建文件的时候,权限值一般为“rw-r--r--”
这里就不得不说一下权限掩码的计算方法了。权限掩码按照官方的算法需要经过复杂的运算。所以在实践当中还有一种更加简便的方法,以下就介绍一下这个简便算法的公式。
文件/目录的默认最大权限 - 文件/目录的掩码 = 文件/目录的权限
在这里有个概念要先明确,那就是文件/目录的默认最大权限
- 对于文件来讲,默认拥有的最大权限是 rw-rw-rw-(666),因为执行权限是最高权限,一定要手动赋予。所以根据公式和默认权限掩码可以算出文件的默认权限为“666-022=644”,也就是“rw-r--r--”
- 对于目录来讲,如果没有执行的权限,那就没办法进入对应的目录,所以目录拥有的默认最大权限为“rwxrwxrwx”(777),所以根据公式和默认权限掩码可以算出目录的默认权限为“777-022=755”,也就是“rwxr-xr-x”
Linux的默认权限配置位置我们早在用户和组管理的时候就有过介绍,也就是在“/etc/profile”里面,可以在此博文里查看“http://t.csdn.cn/eht5q ”
可不可以修改Linux的默认权限呢?当然也是可以的,比如直接修改/etc/profile文件,进行永久修改,或者使用umask + 权限掩码,临时修改。当然,正常情况下不建议修改,因为默认的权限是最安全的配置方式。
chown
命令格式 chown 【-R】 属主名 文件名 //-R为递归更改
示例:
1、将/home/user01目录复制至/tmp目录之下
[root@Server01 tmp]# cp -ar /home/user01/ /tmp/
[root@Server01 tmp]# ls -l
总用量 1
drwx------. 15 user01 user01 4096 9月 17 01:23 user01
2、修改/tmp/user01文件夹的所属者为root用户
[root@Server01 tmp]# chown root user01/
[root@Server01 tmp]# ls -l
总用量 1
drwx------. 15 root user01 4096 9月 17 01:23 user01
chgrp
命令格式:chgrp 【-R】 属组名 文件名 //-R为递归更改
示例
修改/tmp/user01文件夹的所属组为root
[root@Server01 tmp]# chgrp root user01/
[root@Server01 tmp]# ls -l
总用量 1
drwx------. 15 root root 4096 9月 17 01:23 user01