目录
shell命令及其工作原理
Shell的最简单定义:命令行解释器(command Interpreter)
将使用者的命令翻译给核心(kernel)处理。
同时,将核心的处理结果翻译给使用者。
shell的工作原理,相当于一个翻译官的角色,如下图
用户切换
Linux中的用户:root用户(超级管理员)权限高,普通用户权限低,受管控
Windows中的用户:管理员(admin),普通用户
普通->超级用户: su 命令
权限级别提高
除了su来切换超级管理员,我们还可以用 su - 命令
这两个命令的差异在于,su命令,不会让root重新登录,只是身份的切换,最直观的表现是它不影响我们处在的目录。
而su - 命令则是以root身份重新登录,可以看到登录后处在root的家目录
那此时如何从超级用户恢复普通用户呢?
直接输入exit或者ctrl+d,就能恢复普通用户的身份
如何从超级用户->普通用户?
因为root的权限是最高的,root想干什么就能干什么,因此直接su + 用户名就能直接进行切换
sudo
如图可见
通过sudo我们短暂提取了root的权限并实现了mv操作
sudo:是用来进行指定的短暂提权的
比如:安装原件,安装到系统中,需要管理员root的权限---其实只安装了一份,允许所有用户使用
那么问题来了,上面的操作,当我们进行提权时,虽然让输入密码,但是输入的是我们自己的密码,那是不是每个人都可以短暂提取root的权限呢?也就是说人人都是root?
那肯定不是,sudo操作也是需要配置的,并不是谁想sudo就能sudo,我们换一个用户试一下,如下图
Linux系统会提供一个类似白名单的东西,在/etc/sudoers里,而在白名单中的用户,可以进行sudo提权
权限
是什么?
权限的本质是:能或者不能做什么事情
为什么?
1. 控制用户的行为,防止错误的发生
2.
权限首先限制的是角色
举个例子,当你进入学校大门,保安并不阻拦你,是因为你具有学生的角色,当你毕业后失去了学生的角色,保安就会阻拦你,前后你并没有发生变化,但是你的角色发生了变化。
权限要求目标必须具备对应的属性
我们没法在leetcode上看电影,这是因为leetcode并不具有视频的属性,因此即便你冲了leetcode的会员,也没有办法在平台上去看电影,因为目标没有对应的属性
权限 = 角色+目标属性
目标属性 包含 权限,而文件权限 只有读,写,执行三个权限
而在Linux中角色分为 拥有者 所属组 other 三个角色
1.这里弄清一下角色和用户的差异,如下图所示
我们能直接在文件属性中看到拥有者和所属组
2.那么other去哪里了?
Linux系统在用户访问文件时,会让用户与文件的拥有者和所属组进行匹配,如果都不是,那么就属于other角色
3.什么是所属组?为什么要有所属组?
有些公司有赛马制度,即让两个小组,都去完成同一个项目,进行内部竞争,谁先做出的项目并获得认可,那么公司就会推举这个项目。
如果这个公司只有一台服务器,那么两个小组 会分别建立一个目录,来完成自己组的项目
而如果你写了一个项目文件code.c ,如果你的领导要看你的代码,假设没有所属组这个角色,那么,作为文件拥有者的你,只能放开other的权限,那么此时B组的成员也能查看你所写的代码,这个就不太合理,因此增加了一个所属组的角色,完成更精细化的权限管理
更精细化的权限管理,首先要有更精细化的身份角色
怎么办?
如何修改权限
权限 = 角色 + 目标属性
先来修改目标属性
我们直接用 chmod u/g/o(+/-)r/w/x 对应文件
其中我们可以用 逗号,连接 一次修改多个角色的权限
如下图所示
如果我们想一次修改所有角色的权限还可以用a+-来修改
上述文件是我自己的文件,因此我能直接修改其权限, 问题来了
1.我能修改任何人的文件权限吗?
看操作
答案是不能,用户只能更改自己的文件权限
2.如果没有权限会怎么样?
系统会拒绝让我们进行对应操作
那么问题又来了,我是test.txt的拥有者和所属组,拥有者不具有读写权限,但是所属组有对应权限啊,为什么我不能进行对文件的读写
3.确定权限信息的时候,系统会先确定用户是谁?拥有者?所属组?other?
用户角色确定,只确定一次,顺序是:拥有者,所属组,other
不会进行二次确认
4.root用户的权限?
root不受权限约束!
5.如何理解可执行?
可执行权限 != 文件可以执行
有能力和权限才能执行
如果文件并不是一个可执行程序,即便有可执行权限,也无法执行
如果文件是一个可执行程序,但是没有可执行权限,无法执行
如果文件是一个可执行程序,且有可执行权限,能执行
修改角色
更改拥有者chown
更改所属组chgrp
但是我们发现,我要把我文件的拥有者给别人,系统还不让我们这样做
系统默认不允许我们把文件给别人
万一你往文件里塞了点病毒,然后直接把文件给我,当公司出事的时候, 一看文件是我的,那我不直接完蛋了,这不就是甩锅吗?
因此,想把文件给别人需要高权限。
也就是说需要su或者sudo(切换成root) ,才能更改角色
这样如果出事的话,在日志中可以看到谁使用root权限把文件给我了,如果你说你是误操作,那sudo还需要输密码的,绝对是有意的,这样就保证安全性。
除此之外更改文件的拥有者和所属组可以直接用:连起来
之前我们在学习 权限的时候,说白了rwx权限都是两态的,能或不能,因此我们可以把其当成1或0
因此我们可以直接用八进制数字来修改权限
目录权限怎么理解 ?
如果我想进入一个目录,需要什么权限?
如果对目录没有x,就无法进入该目录
rwx分别对目录意味着什么?
如果对目录没有r,就无法查看目录里面的文件
如果对目录没有w,就无法在指定目录内部新建文件
因此默认情况下,我们新建一个目录,rwx权限都要有
任何用户,无法进入到其他用户的家目录
缺省权限
我们新建一个文件和目录
为什么默认权限是我们看到的样子
对于普通文件来讲 :起始权限是666 即110110110 默认不带可执行
对于目录文件来讲:起始权限是777 即111111111 默认携带x
但是我们发现并不是这样的啊,上面两个新建的目录和文件分别是775,664
因为系统默认会存在一个叫做权限掩码的概念:
权限掩码用umask命令查询
第一位和用户有关,因此我们只要考虑后三位就可以了
002 将其写成八进制,即代表 000 000 010
最终权限 = 起始权限 &(~umask)
1.umask 的目的是什么?
希望凡是在umask中出现的权限,都不应该在最终权限中出现
2.为什么要有umask
a.默认权限,由OS自主决定,无法在创建前进行修改---系统可配置,可以灵活满足需要的一种表现
b.特殊情况下,配置umask,可以控制文件的默认权限,让我们的代码都是可控的。
我们可以根据我们的需要修改umask
修改umask后,再创建新目录就发现其权限为000了。
如果你修改umask后,忘记其初始值为多少了,没有关系
umask是内存级的,重新登录系统,umask的值会自动恢复,也就是说umask是在配置文件中写好的
粘滞位
当另一个用户在我的目录里面创建文件,并把其所有权限关掉,我们是无法写入和读取其文件内容的
但是我们可以将其直接删除
我们如何看待这一现象呢,你可能感觉有些奇怪,为什么一个文件不让我读不让我写,但是我却可以直接把其删掉,有没有问题呢?
没有问题
一个文件是否能被删除,与该文件本身无关!与文件所处的目录w权限有关!
凭什么你在我的目录里建文件,还把权限都关掉不让我看,我就能把其删掉
正常来说,其他用户是无法进入到我的家目录下创建文件的,除了root,即便有这种情况,我也能把其文件删掉。
那如果两个用户要进行文件级别的协助呢?
那就不能放在任何一个私人账号下,即任何用户的家目录下
Linux系统提供了根目录,用root短暂提权,建立相应的目录和修改相应的权限,我们就能在根目录下进行文件级别的协助
相当于在公共区域下建立共享文件,但是这个文件仍然能被其他人删,因为这个是在公共区域的,删一个文件与文件本身无关,与该文件所处目录权限有关,而该目录是公共目录
那就会想,把公共目录的w权限关掉,这个虽然能解决问题,但是把w关掉,就无法在公共目录里新建文件,公共目录就失去了自身的意义
这样我们的核心需求就出来了
任何一个人都能新建文件,并修改自己文件的读写权限,让别人看或者写,但是不能让非拥有者删除
有需求,Linux系统就引入了粘滞位的概念 权限标志位 t,粘滞位
chmod +t 目标文件即可
可以看到上图tmp中最后一个小t就是粘滞位,文件无法被非文件拥有者所删除
补充一下,粘滞位对root用户没用,root就是超级赛亚人,想干什么就干什么。