1. shell命令以及运行原理
Linux严格意义上来说是一个操作系统,我们称之为 "核心(kernel)" ,但我们一般的用户不呢个直接使用到核心,因为不会用。所以开发者在核心外面封装了一层 "外壳(shell)" 程序,来与核心沟通。
从技术角度,shell最简单的定义:命令行解释器(command interpreter) 主要包含:
1. 将使用者的命令翻译给核心处理
2. 将核心的处理结果翻译给使用者
就比如在windows操作系统中,我们的点击操作并不是直接作用在内核上,而是将命令交给shell,shell再翻译给内核,内核处理完之后将结果返回给shell,shell再翻译给用户,比如完成了一个窗口的关闭。
外壳程序在翻译命令的时候为了保证稳定性,操作系统不会崩掉。并不是自己上手翻译,而是创建子进程,让子进程进行命令行解释。因为如果外壳程序出问题了,即便内核操作系统还活着也用不了。
广义上我们经常说的操作系统是操作系统内核+外壳,狭义上的操作系统就单只内核。
在Linux中的外壳程序叫bash,它是一个可执行程序
2. Linux权限的概念
2.1 用户设置
Linux下有两种用户:超级用户(root),普通用户
超级用户:可以在Linux系统下做任何事情,不受限制
普通用户:在权限允许中做事情
超级用户的命令提示符是 "#" ,普通用户命令提示符是 "$"
下面我们使用 adduser 新建一个普通用户,passed 用来设置用户密码
在设置密码的时候它是没有显示的,但是我们是敲进去东西了,敲就好了。我这个密码设置的有点简单,所以报了一下,不用管他。
删除用户的时候 userdel -r 用户名 这里不展示删除了
切换用户
语法:su 用户名
例如要是从root用户切换成普通用户张三,可以直接 su zhangsan 。如果想从普通用户切换到root用户,要 su root(root可以省略) ,再输入root的密码。
切换用户就是让另一个用户过来继续操作,而不是进入另一个用户的家目录中。
退出用户的话就是用 ctrl+d
暂时提权
语法:sudo 命令
sudo命令可以暂时提升普通用户的权限至root执行命令,sudo命令后面直接加指令就行,系统会让用户输入目前账户的密码。
不过这个操作要求该用户在系统的信任名单 /etc/sudoers 中,如果没有在可以跟着我设置一下。如果看不懂可以先不设置,我会在 权限与工具(下) 中详细讲解vim工具的用法,看完下再回来配置这个白名单也行。
先进入root账号,输入指令 vim /etc/sudoers ,此时会进入到如下页面
此时按 shift + g 也就是大写的 G
来到这里之后按方向键,使光标移动到root的位置
然后按 yy(连按两次y) p(按一次p) ,可能会报警告不用管,这个文件的权限很高,即使是root操作也会报警告,不过root可以操作这个文件就行
可以看到root那一行被复制出来了一行,接下来按 i ,然后用方向键和backspace键将第二行的 root 单词删掉,换成我们信任的用户名
接下来按 ESC键 然后按 shif+; 也就是按出来一个 : 最后敲 wq! 回车
此时该用户就可以使用sudo指令了
2.2 Linux权限管理
一个文件的权限是访问者和文件自身属性的结合体
1. 文件访问者的分类
文件的所有者 (有权访问文件) user
文件的所属组 (有权访问文件) group
其他用户 (无权访问文件) other
如果煤油刻意设定组,则每个用户自成一组,组内的成员都可以访问这个文件,但是其他用户不能访问,这种设定是为了更细粒度的权限管理。
2. 文件类型和访问权限
头10个字符是文件的权限属性,那个数字之后再说,后面内容所对应的属性我都用不同颜色标注出来了。
权限属性中第一个字符是文件类型,d 是目录,- 是普通文件。之后3个字符为一组,分别表示拥有者、所属组、其他人的权限属性。
基本全权限:
r 可读 w 可写 x 可执行 - 没有该权限
文件类型:
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
2.3 文件访问权限的相关设置方法
2.3.1 chmod 访问权限
语法:chmod [选项] 权限 文件名
功能:设置文件的访问权限
说明:只有文件的拥有者和root才可以改变文件的权限,这个参数选项我们一般用不到,除非可能用到 R 递归修改目录文件的权限
2.3.1.1 chmod 命令权限值的格式:
用户表示符 +/- 权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
上面这段代码中我们给拥有者添加了可执行的权限,让这个文件看起来好像可以执行了,但是因为文件的内容就是不可执行的,因此我们即使 ./file.txt 尝试执行也无法成功。
我们还可以通过用 , 逗号隔开的方式一次操作几个权限。
这里要注意身份认证只会执行一次,就是说现在拥有者和组都是atlanteep,我只取消了拥有者的写权限,但是组的我加入了写权限,可是我们还是无法向文件中写入了。就是因为身份认证只会执行一次,检查到我的身份是atlanteep那么就直接看权限,禁止写入,那我的组即使能写,我也不能写了。
但这里有个例外,就是超级用户可以无视文件权限限制进行操作,这也是我这里换了个账号展示的原因。
上面这段代码红框中展示了 a 可以进行三个人同时操作,但是因为这个是root账号,所以即便没有写权限了,root也能往文件中写内容。
2.3.1.2 chmod 三位8进制数字修改权限
如果我们只看一组权限,分别是rwx,关闭或打开用二进制0、1表示,那么都打开就是 111 用8进制表示就是7,只关闭x就是 110 用八进制表示就是6,也就是说一个八进制数字就可以表示一个身份的权限组,三个八进制数字就可以完成一个文件权限属性的修改。
2.3.2 chown 修改拥有者
语法:chown [-选项] 用户名 文件名
这个选项一般也是 -R 递归更改目录用的
2.3.3 chgrp 修改所属组
语法:chgrp [-选项] 组名 文件名
同理,这个选项一般也是 -R 递归更改目录用的
这里要说一下普通用户不可随意将文件的拥有者和所属组进行更改,必须要sudo到root账号进行提权更改。
2.4 目录的权限
到这里我们对于权限以及身份有了较为清晰的认知,因此后面我们基本上都使用普通用户进行操作。
可读权限:
我们关闭拥有者的可读权限之后就不能看这个目录底下都有什么,但是可以进入目录,也可以在目录中写东西,创建文件或者目录,这个目录中的目录是可以正常查看的。
可写权限:
我们关闭拥有者的可写权限之后就不能在目录下写入新的文件或者目录,但是可以正常进入和查看目录。
可执行权限
我们关闭拥有者的可执行权限之后就不能进入这个文件了。
2.5 umask 权限掩码
我们把刚才在lesson4中建的东西都删除,限制重新创建一个目录和一个文件
我们观察刚新建出来的默认目录权限码值是775,文件权限码值是664。这个默认的码是怎么来的,下面我们不卖关子直接开讲。
一个目录的起始权限码其实是777,因为目录需要可读可写可执行;一个文件的起始权限码其实是666,因为文件不可执行但可读可写。那么在用户使用的时候可能不希望自己的东西被other读取,所以每次在创建好文件或目录之后都要修改一下权限属性,那么Linux系统为了避免这种繁琐的事情出现就搞了一个权限掩码。
可以看到我的权限掩码是0002,这个玩意我们只看后三位。
权限码 = 权限掩码按位取反 & 起始权限码
这样就得到了775 664,如果你对这个权限码不满意我们还可以更改,比如:
我们将权限掩码修改成077后就只有我们自己可以对文件有可执行和读写权限啦。
2.6 粘滞位
在正式进入粘滞位之前我们先设置一个小情景。比如说现在我和张三向搞一个共享目录,这个目录我们两个都能进去进行设置文件等操作。但是这个共享目录肯定不能建在我们中任何一个人的家目录下:
可以看到家目录是不允许除自己意外的任何人访问的,root除外。因此我们决定把这个共享目录设置在根目录下
普通用户是禁止配置根目录的,因此我们只能把root叫来帮忙建一下共享目录,此时还要把目录对于其他用户的w权限放开,这样我们才能在目录中设置文件。
设置好之后我们叫张三上号
现在张三也可以对这个文件进行查看和更改,但是其他人不行,比如现在又来了个李四
他看见我和张三共享文件不带他,于是他很生气就把这个文件删除了。
可以看到李四作为other虽然没有权限更改文件内容,但他可以直接删除文件,这个删除文件或添加文件的权限与文件本身无关,而是在于文件所在目录的权限情况
到这里我和张三就傻眼了,于是为了避免这种情况的再发生Linux给出了一个解决方案:粘滞位
就是在目录中加上 t 选项就可以保护目录里的文件,使得有粘滞位保护的目录中的文件,只能由:超级管理员、目录所有者、文件所有者删除 。
我们用root账号给这个目录加上粘滞位:
此时李四再想删出文件就没有权限了:
也就是说目录给了other w 权限后还可以再加上粘滞位 t 防止有人乱搞。
到此Linux中的权限全部讲解完了,下节我们将讲解Linux中的工具好让我们把代码写起来。