Linux部分的内容,我以权限管理作为起始。

关于Linux命令行操作的部分,大家可以去网上搜搜,教程很多,且全面:【链接】。这里我就不再把相同的东西复述一遍了,毕竟Linux命令这种东西,你不会的时候可以去查,常见的命令敲多了肯定忘不掉

不多说,开始Linux权限操作的内容吧!

本篇博客所有演示均在CentOS7.6下进行


[TOC]

1.什么是权限?

权限是用于对用户进行约束的。正好比视频网站的vip一样,没有vip权限,你就看不到只有vip才能观看的影片。

1.1 root和user

在linux中,用户分为两种

  • root:超级用户
  • 其他:普通用户

其中root用户的权限最高,可以在系统里面为所欲为。其所作操作在一定程度上会影响用户的使用环境。比如你在root里面安装了某个程序,那么所有子用户都可以使用这个程序,反之不行。

在root用户中,你还可以通过su user这个命令切换到任何子用户而不用输入密码。但是从子用户切换到root则需要输入root用户的密码。所以,保证你的root用户密码不被他人知道是很重要的!


2.权限管理

本篇博客主要关注Linux中的文件权限

2.1 文件访问者

在Linux中,文件访问者分3类,对于文件的权限也分3类

访问者文件权限
拥有者 ownerr 读
所属组 grouperw 写
其他用户 otherx 执行

我们要怎么看一个文件对于这三位不同的访问者的权限有什么不同呢?

使用ll或者ls -l命令即可看到区别

image-20220705090617925

这里文件的前缀,即标识了一个文件的对于3个角色的权限。

其中muxue是文件的拥有者,root代表所属组

2.1.1 linux的组

这里需要说明一下,在我之前的腾讯云多人一机的博客中,是用下面这种方式创建子用户的👇

image-20220705090349877

这里就把子用户分到了root组下面,作用是让子用户可以通过su获得root权限

如果你在创建用户的时候没有指定组的话,系统会自动创建一个与用户名同名的组。

  • 组有什么用?

当在一个公司中,多人使用同一台服务器进行开发的时候,就需要通过组来对子用户进行进一步分类。即A组中其他用户(grouper)可以查看到子用户A1的代码,但是B组的用户(other)都看不到A组内的东西。

这样就能实现多个小组开发不同的板块,而互不干扰。


2.1.2 学会看文件前缀

说回正题,我们要怎么看一个文件夹/文件的前缀呢?

1
2
3
drwxr-xr-x 5 muxue root    4096 7月   3 11:56 code
-rw-r--r-- 1 muxue root 1908226 2月 23 2021 get-pip.py
drwxr-xr-x 7 muxue root 4096 6月 26 08:10 GIT

image-20220705092949159

关于第一列的文件类型,有下面几种

image-20220705092155955

现在我们知道了文件权限的查看方式,要如何修改一个文件的特定权限呢?

2.2 chmod修改权限

我们可以使用chmod命令来修改文件权限

1
chmod u-r test.txt

上面这个命令的作用是,给拥有者去掉test.txt文件的r权限。可以用下面这个命令把权限加回去

1
chmod u+r test.txt

同理,如果你需要修改所属组和其他人的权限的话,指定g和o即可

1
2
chmod g-r test.txt //去掉所属组的r权限
chmod o-rwx test.txt //去掉其他用户的所有权限

除了上面这种依次修改的方式,我们还可以用逗号隔开,用一条命令搞定

1
2
chmod u+rwx,g+rwx,o-rwx test.txt 
//给拥有者,所属组加上所有权限。去掉other的所有权限

如果你想批量修改成同一个权限,还可以使用a来指定all

1
chmod a=rw test.txt

image-20220705095558190

2.2.1 以八进制修改文件权限

除了上面这个+和-比较好辩认的方式以外,我们还可以通过“八进制”的方式来修改文件权限。

对于一个用户来说,拥有所有权限rwx,如果我们将它与二进制进行对应,就会得到下面的结果

1
2
3
rwx
111
二进制对应7

注意,这里的八进制并不是要通过八进制来读写权限的编码,而是用二进制来读取后,可得到最高权限7(不会超过7,所以是八进制)

了解上面这个方式后,你便可以写出所有权限类型对应的编号

权限二进制对应编号
rwx1117
rw-1106
r-x1015
r–1004
-w-0102
-wx0113
–x0011

当我们修改一个文件的权限的时候,就不需要用a=这种相对古板的方式。而可以通过编码来直接指定3类用户的不同权限

1
2
3
chmod 777 test.txt //给所有用户为rwx权限
chmod 664 test.txt //给u和g用户为rw-,o用户为r--
//……

2.3 rwx权限区别

修改完这些文件后有什么区别呢?

当我们创建一个文件夹和一个常规文件时,作为拥有者,默认有文件夹的所有权限和文本文件的rw权限。

image-20220705093059153

2.3.1 常规文件

先来看看test.c的各种权限有什么不同吧!

我们可以通过cat读取test.c文件的内容,这便是读权限r

image-20220705093230910

而通过vim、nano等编辑器修改这个文件,就是写权限w

如果我们去掉r和w权限,就无法读,也无法写

image-20220705093412297

使用nano打开test.c文件,会有以下报错

image-20220705093420841

那么对于一个常规文件而言,x权限有什么用呢?

我们知道,当我们使用gcc等编译器编译代码文件时,会出现一个a.out可执行文件。这里的x便是可执行文件的标识。同时,这个文件也是用绿色标明出来了。

image-20220705094507948

如果我们给test.c也加上x权限,则它也会变成绿色,可以直接用./test.c来执行。当然,直接执行一个.c文件是没有意义的

image-20220705094651334

2.3.2 文件夹(目录)

在Linux下,一切皆文件。我们所说的目录也是一个文件

文件=内容+属性

在目录中保存的是文件的属性(包括文件名)我们想访问一个文件,首先要通过路径去找到这个文件。

那么对于一个文件夹而言,rwx权限又是什么呢?

image-20220705094850918

当我们使用ls的时候,其实是可以指定路径的,默认为.(当前路径)

可以看到,现在显示出了Mytest中的my.txt文件。

如果我们去掉文件夹的r权限,在执行ls。就会报错权限不够

image-20220705095007736

得出结论,ls查看某一个文件夹中的文件,需要拥有文件夹的r权限。即便你进入这个文件夹,如果没有r权限,依旧无法用ls显示文件夹里面的内容。

但是这时候,我们还拥有文件夹的w权限,我们可以把其他文件拷贝到Mytest文件夹中

image-20220705095132725

把r权限加回来,可以看到test.c文件已经被拷贝进去了

image-20220705095241481

这便是w权限的作用,修改文件夹中间的内容。比如拷贝另外一个文件到文件夹中

image-20220705095926073

去掉w权限后,我们也无法删除文件夹中的内容

image-20220705095445583

最后,对于文件夹而言,x权限代表的是能否cd进入该文件夹

image-20220705100011833

  • 此时虽然我们无法cd进入,但我们拥有rw权限,可以直接从外部修改这个文件夹里面的内容,并进行访问吗?

答案是nope!不可以

image-20220705100139774

因为在Linux中,所有的操作都要通过路径来进行。路径也是访问文件夹的一个方式(需要x权限)此时因为无法cd进入该文件夹,也就无法通过路径访问这个文件夹的内容。所以没了x权限之后啥事都干不了

当我们把x权限加回来之后,就可以这么做了

image-20220705100409285

  • 如果对于目录只没有r权限,允许进入,可创建文件并写入内容,但不可读取其中内容
  • 如果对于目录只没有w权限,允许进入,允许在目录下ls查看文件列表,但不可以修改里面的文件
  • 如果目录没有rw权限,允许进入,但是不能修改也不能查看目录下的文件内容
  • 如果没有x权限,无法进入,也无法修改/查看其中内容

关于最后一点,不同系统的实现可能不一样。我的系统是CentOS7.6,请以你的实际情况为准!


2.4 chown/chgrp

2.4.1 chown修改拥有者

我们可以通过这个指令,把一个文件的拥有者修改为指定用户

1
chown [参数] 用户名 文件名

注意,在默认情况下,系统是不允许你修改文件的拥有者的。不过我们可以通过在语句前面加sudo的方式,短暂获取root权限,对文件拥有者进行修改

这里如果提示不在sudoer flis里面,可以参考博客里面第八点的解决方案

image-20220705100646121

注意,这里我修改为了root用户,root用户拥有最高权限!即便这是子用户的文件,root用户也可以为所欲为进行修改和删除,不受任何权限的约束。

如果我们把用户改成其他子用户,其实这个子用户依旧访问不到这个文件。

这就好比你告诉你的朋友,我要送你一个键盘。这个键盘的拥有者即将变成你的朋友。但是你没有把键盘给你朋友,键盘还在你家里,你的朋友依旧用不了这个键盘。

换到Linux环境中,就是在A的用户路径下有一个B用户的文件。但由于B用户无法访问A的用户路径,所以依旧无法访问到这个“属于B的文件”

2.4.2 chgrp修改所属组

1
chgrp [参数] 用户名 文件名

这里因为我的环境里面没有其他组,所以就不演示该功能的成果了

image-20220705101446969


2.5 关于默认权限

Linux中有一个默认权限:

  • 默认目录权限777
  • 默认常规文件666

可为什么我创建的目录文件的权限是755,而常规文件的权限是644呢?

image-20220705102332173

这里我们可以用umask命令查看权限掩码

image-20220705102259702

这个权限掩码是什么意思呢?

抛弃首位不看,后面的是022。根据2.2.1中提到的八进制方式,我们可以解读出这个权限为

1
--- -w- -w-

权限掩码的作用就是,在权限掩码中出现的权限,在实际创建文件的时候不会出现

仔细观察你就可以发现,这里我的文件夹权限如下,正好和掩码相反!

1
2
3
rwx rwx rwx //默认权限777
--- -w- -w- //掩码 022
rwx r-x r-x //实际创建755

而常规文件的默认权限666是rw-rw-rw-,实际创建的结果也和掩码相反!

1
2
3
rw- rw- rw- //默认权限666
--- -w- -w- //掩码 022
rw- r-- r-- //实际权限644

如何计算?

这里的权限并不是简单的相减得出来的,其是通过默认权限&(~umask)得出的

  • 先对默认权限的umask进行按位取反
  • 再将取反后的结果和默认权限(目录777,常规文件666)按位得出

对于编程创建目录的时候,我们可以手动指定这个目录的权限,此时计算公式就变成了 指定的权限 & (~umask),这也是为什么要在调用mkdir之类接口之前将umask设置为0,设置为0了之后,就变成了指定权限 & (~0),即指定权限 & 0777,最终创建出来的文件的权限就是我们在传参时指定的权限。

2.5 file命令

除了用文件属性的第一位来查看我们文件的属性之外,我们还可以用file命令来查看更加详细的文件属性

image-20220715174109071

当我们创建了一个C语言文件,并对他进行编译后,可以得到一个C的源文件和一个可执行文件

image-20220715174156924

常用选项如下

1
2
-c 详细显示指令执行过程,便于排错或分析程序执行的情形
-z 尝试去解读压缩文件的内容

2.6 粘滞位

简单介绍,粘滞位就相当于给一个目录上了胶水,其他人无法删除被黏住的目录(和目录下的文件)!

1
chmod +t test

前面提到了,作为other,你可以去访问别人的目录(只要other有对应的权限)

比如这里我用muxue用户创建了一个test1.c文件,另外一个用户可以读取这个文件,但是不能写入

image-20220715211108621

vim打开该文件会报错

image-20220715211236125

但这里有一个bug就是,即便你没有那个目录内文件的权限,你依旧可以删除这个目录下的文件!

image-20220715211308427

粘滞位的存在就是保护整个目录,不允许被其他用户删除!

image-20220715211359007

添加粘滞位后,可以看到在Other的权限处出现了一个大写的T

这时候我们再尝试用另外一个账户删除,就会报错——吗?

image-20220715211550124

以上就是一个明显的错误示范,粘滞位保护只能在root下进行操作,而且粘滞位只能给目录上,并不能单独给一个文件上!

image-20220715212644165

给目录上了粘滞位后,再尝试删除,系统会报警告

image-20220715212601038

被保护后的目录,该目录和目录下的文件只能被下面的用户删除:

  • 超级用户root
  • 目录的所有者
  • 该文件的所有者

关于最后一点,虽然粘滞位保护了目录下的其他人的文件不能被你删除。但这不影响你在这个目录下创建/写入/删除你自己的文件


结语

关于linux权限管理到这就结束啦!

linux操作在未来找工作的时候非常重要,也是我们学习的时候和其他童鞋拉开差距的一环。

因为很多人可能上完本科4年都不知道企业招聘的时候会考linux操作😥

有什么问题可以在下面留言!看到了就会回复的