本文转载自微信公众号「小菜良记」,作者蔡不菜丶。转载本文请联系小菜良记公众号。
小菜提示: 看完此文手痒的同学,请在测试服务器上联系哦,可不能随便上生产服务器上测试!
前言: 最近有不少同学私聊我,说面试的过程中遇到的面试官提问 Linux 相关的问题,不禁有些抱怨,自己又不是运维,为啥要精通 Linux,会一些基本命令不就可以了么!
首先看到这个问题,小菜是有点懵的,为什么 Linux 是运维才需要精通的呢。作为有担当的 搬砖 打工人,线上出现问题,不止运维人员首当其冲,开发人员也少不了 "冲锋陷阵"。所以当你熟悉 Linux 的操作后,线上出现问题后,还可以 装* 的跟别人说下,"莫慌,让我来" !
话不多说,小菜这篇就带你来了解一下 Linux 中的 权限 是如何管理的,Linux 的基本操作可以查看这篇文章:Linux操作
权限入门
1. 文件属性
如果你刚听到 文件属性 这几个字眼感到比较陌生,不要慌张,因为只要你用过 Linux ,你可不会对 ls 或者 ll 这两个命令感到陌生,这两个都是用来查看文件的命令,你在任意一个目录下执行 ls -l 会出现类似以下页面:
我们先来详细看下每个部分分别代表什么意思:
首先我们先明白 ls 是 list 的意思,用于显示文件的文件名与相关属性,其中 -l是用来列出所有文件的详情权限与属性。
1)权限
我们来看下 drwx------ 这个部分的内容,这个部分我们细数之后发现其中包含 10 个字符:
- 第一栏: 表示该文件是目录、文件或是链接文件等
- d : 表示目录,上面 www 则为一个名为 www 的目录
- - : 表示文件,上面 test.txt 则为一个文件
- l : 表示链接文件【link file】
- b : 表示为设备文件里面可供存储的周边设备
- c : 表示为设备文件里面的串行端口设备,例如键盘、鼠标(一次性读取设备)
- 第二栏: 三个字符为一组,表示 文件拥有者可具备的权限
- 第三栏: 三个字符为一组,加入此用户组的账号拥有的权限
- 第四栏: 三个字符为一组,表示非本人且没有加入本用户组的其他账号的权限
注: 自 第二栏到第四栏 均为三个字符为一组,其中字符可能出现的有 r、w、x、-,其中【r】 表示可读(read),【w】表示可写(write),【x】表示可执行(execute),【-】表示没有权限。且 rwx 三个的位置是固定的。
小试牛刀:
-rwx-w-r-- 表示的意思?
首先拆为 4 个部分,- rwx -w- r--
- -: 表示这个表示一个文件
- rwx: 这个文件的拥有者有着 可读、可写、可执行 的权限
- -w-: 表示通用户组下的其他账号对该文件拥有 可写 的权限
- r--: 表示其他用户只能对该文件拥有 可读 的权限
2)链接数
3 表示有多少文件名链接到此节点(inode),每个文件都会将它权限与属性记录到文件系统的 inode 中,不过我们使用的目录树却是使用文件名来记录,因此每个文件名就会链接到一个 inode ,这个属性记录的就是有多少不同的文件名链接到相同的一个 inode 号码。
3)拥有者
表示这个文件(或目录)的拥有者账号。
4)用户组
表示这个文件的所属用户组,我们在 LINUX 中,一个账号会加入一个或多个用户组中。如果不属于同一个用户组的账号就不具备对该文件(或目录)的相应权限。
5)文件容量
表示该文件的容量大小,默认单位是 Bytes
6)修改日期
表示这个文件的创建日期或者最近的修改日期,如果该文件被修改的时间距离太久,那么时间会仅显示年份,而不会具体到月、日以及时间。不过我们可以使用 --full-time 来显示完整的时间:
7)文件名
表示文件名,如果文件名之前有 [ . ] ,则表示该文件为隐藏文件,平时使用ls 或者 ll不会显示出隐藏文件,我们可以使用 ls -a 来显示所有文件:
2. 何为权限
在我们还没接触 Linux 之前,接触最多的便是 windows 系统了,在 windows 系统中我们好像没有感受到权限的存在,只有在系统盘的部分文件需要管理员权限,但是这些权限也不是我们直接管理的。
但是在 Linux 中每个文件都添加了很多属性,而且还加入了用户组的概念,这些功能并非毫无用途,说到底便是保护 数据安全性。
权限有何用处
- 保护系统功能
在 Linux 系统中,root 用户可以对系统服务进行 读写和执行 操作。如果没有权限的限制,每个用户都可以操作系统文件,那是一件非常危险的事情,重则造成服务器瘫痪。
- 数据隔离和共享
Linux 系统中存在 用户组 的概念,一个账号可以加入一个或多个用户组。用户组其实也相当于一个 团队 的概念。同一个团队的队员可以进行数据的共享,而不能看到其他团队的数据信息。如果我们要保证其他团队的队员不能看到本团队的数据,那么就应该建立一个用户组,然后给对应的文件赋予 rwxrwx---,这样子就是除了文件拥有者和文件用户组可以对该文件进行 读写执行 操作,其他用户都不能使用。
3. 实际修改
我们先了解下权限有关的三个指令:
- chgrp:修改文件所属用户组
- chown:修改文件拥有者
- chmod:修改文件的权限
1)chgrp
这个指令是用来修改文件所属用户组的,对单词比较敏感的小伙伴可能会猜到这个指令是change group 的缩写,当你了解到是 change group 的缩写后是不是就会感觉记得比较清楚啦。
既然这个指令是用来修改文件所属的用户组的,那么前提就是这个用户组是存在的,也就是 /etc/group 这个文件里存在,否则会报错的。
小菜扩展:
创建用户组:groupadd 用户组名称,示例如下:
删除用户组:groupdel 用户组名称,示例如下:
创建用户:useradd -m -g 组 新建用户名,示例如下:
我们现在 /home 的目录下建一个 chgrp 的文件夹,里面有个 text.txt文件,如下:
我们从图中可以看到这个文件的所属用户组是root,这个时候我们想把这个文件的用户组改为test ,需要如下操作:
通过chgrp test text.txt已经成功将该文件的用户组改为 test 了。
2)chown
这个指令是用来修改一个文件的拥有者的。没错,这个指令便是change owner 单词的缩写。
使用这个指令的前提便是,用户必须是已经存在该系统中,也就是在 /etc/passwd 这个文件中有记录的文件名称才能修改。上面我们已经在扩展中介绍了如何创建用户,小伙伴们记得动手试一试。
chown 的用途比较多,它可以直接修改所属的用户组,而且如果要连目录下的所有子目录或者文件同时更改文件拥有者的话,直接加上 -R 的选项即可。
基本命令:
- chown [-R] 账号名称 文件/目录
- chown [-R] 账号名称:用户组名称 文件/目录
- 注:
- -R 是进行递归修改,连同子目录一下的所有文件都修改
示例:
在 /home/chown 的目录下有个 test 目录,test 目录下有个 test.txt 文件,这两个的拥有和用户组均是 root。这是我们使用 chown 来修改 test 这个目录的拥有者:
- chown cbuc test
可以看到 test 这个目录的拥有者已经被修改成了 cbuc 这个用户,但是 test 目录下的test.txt 并没有被修改,这个时候我们加上 [-R] 这个参数试一下:
- chown -R cbuc test
可以看到两个的拥有者都已经修改成了 cbuc 这个用户,我们再试下同时修改用户组:
- chown cbuc:test test
这样子我们就可以很方便的使用 chown 这个指令来修改文件的用户组和拥有者了。
3)chmod
这个指令是用来修改文件的权限,权限的设置可以分为两种,分别是使用 数字修改 和 符号修改
数字类型修改文件权限
在上面我们可以看到权限包括 **读(read)、写(write)、执行(execute)**这三种,同时存在三种身份,分别是 拥有者(owner)、所属群组(group)、其他人(others)
权限字符分别为 :r w x 。其种每个字符分别对应的数字如下:
- r: 4
- w: 3
- x: 1
这样子如果一个文件权限为 :-rwxrwxrwx
它的计算规则便是:
- owner: 4+3+1 = 7
- group: 4+3+1 = 7
- others: 4+3+1 = 7
这样子与 chmod 相结合的方式便是 chmod 数字 文件/目录,同时 chmod 也支持递归的操作,同样加上参数 [-R]:chmod -R 数字 文件/目录
示例:
我们可以看到 test 这个文件夹中用户组拥有的权限是r-w ,也就是可读、可执行,这个时候如果我们赋给用户组 可读、可写、可执行 的权限,我们可以这样做:
- chmod 775 test
这个时候,test 文件夹的用户组权限就变成了可读、可写、可执行
如果我们想要让 test 文件夹下的 test.txt文件也变成跟 test文件夹一样的权限,我们可以加上 [-R] 参数,也就是 chmod -R 775 test,这样子 test文件夹下的子目录和子文件都会相对应修改。
符号类型修改文件权限
上面我们介绍了通过数字类型修改文件权限,我们还可以通过符号修改。我们也已经知道了Linux 中存在三种身份,分别为 user、group、others,那么我们就可以借由 u、g、o三个字符来表示是三种身份的权限,此外还有个 a,即代表全部的身份,使用方法如下:
使用方式:
- chmod u=rwx,go=wx text
这个指令的意思就是给拥有者赋予rwx权限,用户组和其他用户赋予wx权限
- chmod a+w test
这个指令的意思就是给所有身份加上 可读 的权限
- chmod a-w test
这个指令的意思就是给所有的身份移除 可读 的权限
小菜扩展1. 文件种类
我们在上面已经看到了这张图,也已经了解到 d 这栏代表的是文件的种类,而且我们平时比较常见的是 - 和 d 这两种类型,那么除了这两种类型之外还有哪些种类的文件呢?
1. 常规文件(regular file)
这个指的是我们在进行读写的类型的文件,表示字符便是 -,常规文件中我们也可以分为以下几种:
- 纯文本文件(ASCII):这是 LINUX 中最多的一种文件类型,这种文件类型是我们可以直接读到的数据,例如数字、字母等。
- 二进制文件(binary):一般来说可执行的文件(除了脚本文件)就是这种文件类型的,比如执行指令 ls 、 cd这些就是一个二进制文件。
- 数据文件(data):有些程序在运行的过程中会读取某些特定格式的文件,那些特定格式的文件就是数据文件。
2. 目录(directory)
这是指的就是目录,表示字符为 d
3. 链接文件(link)
类型 windows 系统中桌面上的快捷方式,表示字符为 l
4. 设备与设备文件(device)
与系统周边及存储等相关的一些文件,通常都集中在/dev 这个目录之下,通常又分为两种:
- 区块(block)设备文件 :就是一些存储数据,以提供系统随机存取的接口设备。表示字符为 b
- 字符(character)设备文件 :是一些串行端口的接口设备,例如键盘、鼠标等。表示字符为 c
5. 数据接口文件(sockets)
这种类型的文件通常被用在网络上的数据交换。一般在/run或/tmp这些目录下,表示字符为s
6. 数据输送文件(FIFO,pipe)
FIFO 也是一种特殊的文件类型,他主要的目的是解决多个程序同时读写一个文件所造成的错误问题,表示字符为p
2. 文件扩展名
事实上,Linux 的文件是没有所谓的扩展名。在 windows 系统中,能被执行的文件扩展名通常是 .com、.exe、.bat 等,而在 Linux 系统中,不需要扩展名,我们只需要这个文件具备可执行的权限,也就是 x
一个文件具备了 x 可执行的权限,只能代表他具有可执行的能力,而不一定可以执行成功。能否执行成功取决于该文件的内容。
那么在 Linux 中常见的扩展名有哪些呢:
- *.sh :表示 脚本 或 批处理文件
- *.Z、*.tar、*.tar.gz、*.zip、*.tgz :这些都是表示经过打包的压缩文件
- *.html、*.php :网页相关文件,代表 HTML 语法或 PHP 语法的网页文件
这篇 Linux 的权限管理就讲到这里啦,相信看到这里的你也一定有所收获,赶紧试试Linux 上的骚操作吧!路漫漫,小菜与你一同求索!