就像我们现实生活中的各种单位一样,不同的管理层有着不同的权限,管理的层级越高权限就越大。
就好比一个公司的老板自然就拥有最高权限,可以任意开除或录用某个人。在我们的Linux系统中也是有这样的层级分类的。
在Linux中的用户主要分为两类:超级管理员用户(root)和普通用户,但普通用户也可以细分为在“白名单”内的用户和不在“白名单”之内的用户。
超级管理员用户也就是root用户几乎不受任何权限用户,他可以执行任何指令,也可以不受任何权限限制的查看修改和删除任意文件即用户。
总结来说,Linux中的权限主要是针对各种用户的。
Linux中的权限分为三类:
r --可读权限
w --写(修改)权限
x --可执行权限
想要很好的理解Linux中的权限管理,就要先来理解一个概念——Linux中一切皆文件。
简单来说就是Linux中统一以文件的方式来管理各和访问种指令和设备。
反过来理解,就是任何东西只要在Linux操作系统中,不管它是不是文件,Linux都以文件的方式对它们进行管理和访问。
例如我们可以使用which指令和whereis指令来搜索各种指令:
我们最终会看显示了一堆目录和路径,也就是说Linux中是以文件的形式来存储这些指令的。
Linux中的文件访问者分为三类:
文件的所有者:u(user)
文件的所有组用户:g(group)
其他人:o(other)
而Linux的文件权限主要就是针对这三中用户的。我们可以随便在一个目录下执行ll指令,就会发现每个文件的开头都跟着一长串的字符:
其中第一个字符表示的是文件类型,如果是d的话就是目录文件,如果是-的话就表示普通文件:
后面的这九个字符其实是要分成三组,每一组分别对应着上面的某个访问者所拥有的权限,其所对应的访问者如下:
如上图举例:该文件的拥有者对该文件有读写和执行权限,所属组有读和执行权限,其他人有读和执行的权限(‘-’ 就表示该用户没有对应的权限)。
Linux中有上千条指令,有些指令是什么用户都能执行的,但有些指令就只有root用户才能执行。
就例如安装软件或各种指令的指令:yum就只有root用户能执行。
那么普通用户就绝对不能执行yum只领了吗?
其实是可以的,我们可以使用sudo指令来对普通用户进行“提权”,这样就算是普通用户也能执行权限更大的指令了:
但是我们还会发现一个问题,就是当我们输完当前用户的密码之后会发现指令并没有被执行,而是给出了下面这条提示:
系统提示我们,当前用户并不在一个名为“sudoers”的文件中。
那这是怎么回事呢?
其实,虽然我们可以通过sudo来对我们的用户进行提权,但并不是所有的用户都可以被提权的。
想想如果每个普通用户都可以通过sudo来执行权限更高的指令,然后只需要输入自己的密码就能执行指令了,那Linux的权限设计岂不是有大bug?
所以普通用户想要提权成功就必须要经过root用户的同意,而同意的方式就是在sudoers文件中加入该普通用户的名字。
怎么操作呢,我们可以先打开这个文件,注意这个文件必须是root用户打开才是正确的。
该文件在root用户下的路径是 /etc/sudoers:
我们只需要像上图所示,将我们想要被提权的用户的名称加上去即可,然后在保存退出。
然后我们新加的这个用户就可以提权成功了:
这里我的系统,虽然已经安装了这条指令,但可以证明的是提权成功了。
如果我们想对某个文件的权限进行修改,我们可以使用chmod指令。
chomd指令的具体用法是:
chomd u/g/o+r/w/x 文件名
chomd u/g/o-r/w/x 文件名
意思就是针对某种用户对某文件的权限加上或是减去某个权限。
例如我们想去掉“其他人(o)”对某一文件的“读”权限,我们就可以这样做:
而如果我们又向把读权限加回来就可以这样做:
而如果在chomd后面没有指明何种用户的话,那就是默认对所有类型用户都修改权限:
除了上面的基础修改方法,其实我们还有一种更“便捷”的修改权限的方式,那就是使用三位八进制数来对文件的权限统一修改。
举一个例子:
我们会发现当执行完“chmod 777 test.t”指令后所有用户对应的权限都被更改了。
其实想要理解这3个数组并不难,我们只需要将对应有权限的位置用1来表示没有权限的位置用0来表示,例如目前ExerciseDir的权限是:
rwx rwx r-x
我们用数字对应就变成了:
111 111 101
我们可以把每种用户对应的权限看做是一个三位的二进制数,然后再转化成八进制就变成了:
775
我们将test.t的权限也设置成775,就可以看到这两个文件的权限变得一样了:
但是这种方法看起来是比较简便的,但是如果不常进行二进制转8进制的话可能还是需要一段计算时间的。
所以如果是想要快速修改所有用户的权限的话可以考虑使用这种方法,但如果只是想修改单种用户的单个权限的话,我感觉还是使用基础方法会比较直观一点。
如果我们想要修改某个文件的拥有者,我们可以使用chown指令,该指令的使用方法如下:
chown 新拥有者 文件名
但是需要注意的是,修改文件的拥有者是需要root的权限的,所以我们得加上sudo指令。
例如我们可以对test.t修改以下拥有者:
我们就会发现test.t的拥有者由原来的Mr_Lin1变成了Mr_Lin2了。
上面的第一个用户名表示的是拥有者,第二个用户名表示的是所属组的组长,而除了所属组和拥有者以外的用户就都属于其他人,所以其他人也就没必要在显示出来。
而修改文件的所属组我们可以使用chgrp指令,该指令的用法如下:
chgrp 新所属组 文件名
其实我们在新建一个普通文件或者目录的时候是有对应的默认权限的,普通文件的默认权限是666,目录的默认权限是777。
但当我们真的创建一个文件和目录并查看其权限的时候却发现并不是这样:
我们会发现对应的权限分明是664和775。
新建一个文件的权限其实是默认权限减去该用户的权限掩码,也就是将权限掩码中有的权限减去。对于每个类型用户对应的三位二进制数来说其实计算的方法很简单,就是将权限掩码按位取反后再与默认权限按位与即可。
我们可以使用umask指令来查看权限掩码:
将权限掩码002转化成二进制为:000 000 010,按位取反后为:111 111 101,所以和普通文件的默认权限110 110 110 和目录文件的默认权限111 111 111 按位与后就得到了110 110 100和111 111 101,也就是664和775。