一、Linux下用户的分类
要知道权限,我们首先需要知道在Linux下用户的分类:
在linux中用户一般分为两类:
root:超级用户(基本不受权限的约束)
普通用户:普通用户是受权限的约束的
超级用户:可以再linux系统下做任何事情,不受限制
普通用户:在linux下做有限的事情。
超级用户的命令提示符是"#",普通用户的命令提示符是"$"
1.用户之间的切换
首先是这两个用户是如何切换的?
比如我们当前是一个普通用户
我们可以使用su指令,然后我们输入root的密码即可,这样我们就能成为root用户
这样切换以后,我们会发现,我们依旧处于原来的路径中,但是用户已经更改为了root账号了
我们从dream(我的用户名)变成了root,此时,我们依旧处于原来的路径中,但是用户已经更改为了root账号了
现在当我们想要退出来的时候,我们可以直接使用exit或者CTRL + D快捷键,这样我们就可以退出root用户了
除了直接使用su,我们还可以加上-,也就是使用 su -指令
不过我们可以注意到,当我们输入密码以后,它是一种以登录的方式进入进去的,所以会显示登录的一些信息,并且它的登录后当前的目录直接切换为home目录
su就像是一个直接的身份转变。直接将一个普通用户变成root,但并不是以重新登录的身份变化的,而是把一个人变成了root
同样的,对于su -以后的root,我们直接退出的话,会显示logout
当我们是root用户了,我们想要登录一个普通用户,我们也可以su加上指定用户名即可,这里不需要密码。当我们想退出的时候直接exit或者CTRL+D即可
同样,对于su -以后,我们直接退出的话,会显示logout
2.对一条指令的提权
当我们目前是普通用户的时候,我们知道,我们是不可以安装软件等操作的
因为安装软件其实就是将某些文件拷贝到系统的指定目录,而普通用户是没有权限进行拷贝的
所以我们可以使用sudo指令进行提权
sudo command
sudo后面加上你需要的操作,然后输入你的密码即可
不过在这里我们可能会觉得有些问题?那这样的话sudo只需要加上我当前账号的密码就可以了,那岂不是人人都是root,即便不知道root密码的情况下?
事实上却并非如此,你不信可以试试,你会发现sudo用不了。
那是因为,我们当前adduser新建出来的用户,没有办法执行sudo,因为系统不信任我们,除非未来将普通用户,添加到系统的信任白名单里面
如下图:
二、什么叫权限
1.权限
权限=角色+文件的属性
权限的最通俗的解释就是一件事情是否允许被我们做
权限认证的是身份(权限和"人"有关,这个人是有身份/角色的)
权限也和事物的"属性"有关(毕竟我们不可以将硬盘像面包一样啃一口
这里的属性,我们指的就是文件属性。
文件属性有三种:可读可写可执行
2.文件的属性
我们可以先创建一个目录和一个普通文件,然后使用ll命令显示如下
我们可以看到有很多列,最后一列是文件名,然后紧接着的三列是时间。这些很容易看出来
可是前面五列又代表了什么呢?这个,我们需要分开认识。
3.文件类型
首先是第一列我们进行分析一下
第一列的第一个字符是代表着文件的类型
文件类型:Linux系统中文件名后缀没有直接的意义(当然不代表它不用)
也就是说,Linux系统不以文件后缀作为文件类型,而是以这个第一个字符代表文件类型
下面是第一个字符所代表的文件种类
- :普通文件
- d : 目录文件
- b : 块设备文件
- c :字符设备文件
- p : 管道文件
- ...
其实一般来说我们只需要用到目录文件和普通文件就行。
b是块设备文件,其实就是磁盘文件,c是字符设备文件,通常有键盘、显示器文件等,如下所示的都是字符设备文件,p是管道文件,一般用于通信
4.权限属性
如下所示,第一列的后九个字符代表的是权限的属性
- r : 可读
- w : 可写
- x : 可执行
- - : 对应位置没有权限
这些权限是跟角色的身份有关系的
而我们将这些人划分为三种角色、权限身份
- 拥有者
- 所属组
- other
对于我们下面的信息中,第三列就是拥有者,第四列就是所属组(分别是我框起来的两列)
而对于其他人,不是拥有者也不是所属组那就是other
第五列是文件的大小
对于第二列,我们暂时先不讨论
现在,我们先回过头来看第一列的后九个字符
他们三个三个为一组,分别对应拥有者,所属组和other的权限
而且对于每一个权限里面,三个的位置分别依次代表,是否可读,是否可写,是否可执行,就比如我划线:
对于拥有者的权限是可读可写可执行
对于所属组的权限是可读可写可执行
对于其他人的权限是可读不可写可执行
需要注意的是root其实是不受权限约束的
举个例子:
首先,我们回到root用户,我们之前写了这个
现在我们是可以读取的
下面,我们将这个Hello.txt的权限给全关了
现在按照道理来说,应该不能访问了,但是我们是高贵的root用户,我们无视权限,照样访问。
三、更改权限
一般而言,更改权限的人只有两种,一个是拥有者 ,一个是root
在Linux中更改权限的指令是:
1. chmod 更改文件的属性
chmod指令可以进行权限的修改
功能: 设置文件的访问权限
格式: chmod [ 参数 ] 权限 文件名
常用选项:
R -> 递归修改目录文件的权限
说明:只有文件的拥有者和 root 才可以改变文件的权限
chmod命令权限值的格式
用户表示符 +/-= 权限字符
+: 向权限范围增加权限代号所表示的权限
-: 向权限范围取消权限代号所表示的权限
=: 向权限范围赋予权限代号所表示的权限
用户符号:
u :拥有者
g :拥有者同组用
o :其它用户
a :所有用户
实例:chmod u+w /home/abc.txt
chmod o-x /home/abc.txt
除了以上的指定修改,还有一种是利用比特位一一对应的方式来进行修改
②三位 8 进制数字
示例: # chmod 664 /home/abc.txt
chmod 640 /home/abc.txt
2. chown 更改拥有者
我们可以使用chown更改拥有者
但是当我们直接这样使用的时候,我们发现是不可以的
因为还需要考虑接受方是否想要。
所以在这里我们需要使用sudo来进行指令的提权或者直接用户root来执行。
chown
功能 :修改文件的拥有者
格式 : chown [ 参数 ] 用户名 文件名
实例:
chown user1 f1
chown -R user1 filegroup1
3. chgrp更改所属组
既然拥有者都可以更改,那么所属组当然也是可以更改的了
不过还是一样的, 我们无法直接去更改所属组吗,即便我们本身就是所属组,但我们仍需要使用root去更改,或者如果是拥有者也是可以更改的
chgrp
功能 :修改文件或目录的所属组
格式 : chgrp [ 参数 ] 用户组名 文件名
常用选项 : -R 递归修改文件或目录的所属组
实例 :
chgrp users /abc/f2
在使用chown的时候,如果我们在中间加上冒号,然后就可以一次性连续更改拥有者和所属组了
四、起始权限问题
当我们创建了一个新的文件的时候,我们发现它的起始权限是如下的
如果我们又创建了两个目录,它的起始权限是这样的
下面我们要介绍
umask
功能 :
查看或修改文件掩码
新建文件夹默认权限 =0666
新建目录默认权限 =0777
但是
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到 umask的影响。假设默认权限是 mask ,则实际创建的出来的文件权限是 :
mask & ~umask
格式 : umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为 0022 ,普通用0002
这个0002就是一个八进制数,第一个0代表它是一个八进制数,后面的三位才是关键的。后面的三个八进制数刚好可以形成9个比特位
权限掩码:凡是在umask中出现的权限,不会在最终的文件权限中出现
所以最终,才有了本应该是666和777,但是最终确变为了664和775
最终权限 = 起始权限 & (~umask)
如果我们想要修改umask,我们直接它在后面添加八进制数字即可:
五、目录文件的读写执行权限
对于text.c文件它的读写执行,我们都很好理解,
可是对于dir1这个目录文件,它的读写执行就有点奇怪了,那么究竟都代表什么意思呢?
如果我们对这个目录文件的读权限给去掉了,那么我们可以看到,我们仍然可以进去这个文件,并且在这个目录文件中创建文件
所以读权限并不影响能否进入,但是如果我们想看目录的文件呢?
很抱歉,它不让我们看,所以读权限影响我们能否去看
如果我们继续将这个目录文件的x给去除掉,我们会发现,我们无法进入这个文件了
但是如果我们有r权限的话,我们可以去看它里面的内容
所以对于目录
r : 是否允许我们查看指定目录下的文件内容
w : 是否允许我们在当前目录下进行创建、更改、删除
x : 是否允许用户进入对应的目录
六、粘滞位
我们可以看一下我们的家目录里面的信息
可以看到,每一个用户它的拥有者和所属组都是它自己,并且只有拥有者有权限,其它的都没有权限
所以普通用户自己的家目录权限是700,我在我的家目录创建的文件,别人都看不到
但是有时候,我们多个用户想要进行文件数据的共享
所以就说明了我们所建立的共享文件,不能在任何一个人的家目录下
所以我们可以使用root账号在根目录下创建一个共享文件shared
这样大家就都能从这个目录共享文件了,但是因为大家都有权限,如果哪个用户急了,直接把这个目录
删了,这可不行为了避免被删除我们的文件,我们可以去关掉这个shared目录的写权限
可是这样做的话如果我们去掉了共享目录的w权限,我们也同时无法创建文件了,这就不是共享了!
为了使得让其他人无法删除文件,所以我们可以使用一个新的位,也即是粘滞位 即直接o+t就可以了
这时候其他人就没办法删除这个目录了
当然root本身是可以删除这个目录的
所以粘滞位:给目录设置,一般是共享目录,大家可以在目录进行各自文件的增删查改,但是只允许文件的拥有者和root去删除文件,其他人一概不允许,t就是一种特殊的x权限
也就是说root用户是可以无视前面的一切规则的。在比如root自己的文件,即便我将我自己的权限都给关了,root照样想干啥干啥
不过如果每次我们想要共享文件的话,这样是不是有点太费劲了呢?
其实在linux中,根目录下就有一个文件tmp,他就是带了粘滞位的