Linux 严格意义上说的是一个操作系统,我们称之为核心 (kernel),也就是内核,但是一般用户,不能直接使用 kernel,而是通过 kernel 的外壳程序,也就是所谓的 shell 来与 kernel 沟通。
为什么不能直接使用 kernel ❓
从技术角度,Shell 的最简单定义:命令行解释器 (command Interpreter) 主要包含:
对比 windows GUI,我们操作 windows 不是直接操作 windows 内核,而是通过图形接口,点击,从而完成我们的操作 (比如进入 D 盘的操作,我们通常是双击 D 盘盘符,或者运行起来一个应用程序)。
shell 对于 Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给 Linux 内核。反馈结果在通过内核运行出结果,通过 shell 解析给用户。
【帮助理解】
如果说你是一个闷骚且害羞的程序员,那 shell 就像媒婆,操作系统内核就是你们村头漂亮的且有让你心动的 MM小花。你看上了小花,但是又不好意思直接表白,那就让你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的 bash。如果小花已经心有所属了,而你又死缠烂打,甚至想做出一些违法操作,媒婆就可以直接拒绝。
张三为什么不去直接找如花 ?&& 媒婆存在的价值 ?
什么是shell ❓
shell 是包裹在操作系统外的一层软件层,它叫做命令行解释器。
为什么要存在shell ❓
shell VS bash ❓
如果 shell 是媒婆,那么 bash 就是王婆。
也就是说 shell 是对所有外壳程序的统称,而王婆是具体的一个外壳程序 —— centos 7 > bash
也就是说不同的 Linux 环境,它们所使用的外壳程序不一定一样。
简单了解进程 ❓
Linux 在登录时,其实本质是系统创建一个登录进程,其中会为我们提供服务如通信服务、绘图服务等。对于进程我们可以从 windows 下打开任务管理器就可以看到每一个运行中的软件创建的进程。
当用户登录 Linux 系统的时候,系统会给用户创建一个进程,一般叫做 bash (命令行解释器 (服务) )
这里我们可以使用命令 ps axj | grep bash 查看当前系统的 bash 进程
复制 SSH 渠道后再次查看:增加了一个 bash 进程
Linux 下有两种用户:
注意为了更好的学习,后面尽量少使用 root 用户。
root 用户是 Linux 中一个管理员的角色,且只有一个 root 帐户,它具有最高权限。
这里一定是得有两组密码的,且一定不要把两组密码设置成一样的。
怎么切换用户 ❓
命令:su [用户名]
功能:切换用户
例如,要从 root 用户切换到普通用户 user,则使用 su user。 要从普通用户 user 切换到 root 用户则使用 su root (root 可以省略),此时系统会提示输入 root 用户的口令。
su 和 su - ?
注意 su 同 su root,以后我们要安全切换成 root 时可直接 su -。
sudo ❓
如果不想切换成 root ,只想用 root 的身份去执行命令,可以在命令前加上 sudo,这样就可以对命令进行短期的权限提升。
注意我们在 sudo 的时候可能会报错,这里先不打算解决,因为涉及到后面学的知识,这里可以先用 su -。
什么是权限 ❓
所以文件权限 = 人 + 事物属性
文件权限属性:r(读)、w(写)、x(执行权限)
人 (不是特定具体的人,而是一种角色):拥有者、所属组、other (其它)
a) 文件类型
使用命令 ls -l (ll) 显示的多列属性的第一列对应的字符来区分它的文件类型。
b) 基本权限
a) 字符表示方法
Linux表示 | 说明 | Linux | 说明 |
---|---|---|---|
r - - | 只读 | - w - | 仅可写 |
- - x | 仅可执行 | r w - | 可读可写 |
- w x | 可写可执行 | r - x | 可读可执行 |
r w x | 可读可写可执行 | - - - | 无权限 |
b) 八进制数值表示方法
权限符号 (读写执行) | 八进制 | 二进制 |
---|---|---|
r | 4 | 1 0 0 |
w | 2 | 0 1 0 |
x | 1 | 0 0 1 |
r w | 6 | 1 1 0 |
r x | 5 | 1 0 1 |
w x | 3 | 0 1 1 |
r w x | 7 | 1 1 1 |
- - - | 0 | 0 0 0 |
其中我们可以直接使用八进制来替代 u、g、o 中的 r、w、x ❗
$ chmod 777 file.txt
$ chmod 000 file.txt
$ chmod 640 file.txt
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项:
chmod 命令权限值的格式:
1️⃣ 用户表示符 +/-= 权限字符
实例:
$ chmod u-r file.txt
$ chmod g-rw file.txt
$ chmod o+rwx file.txt
$ chmod u+r,g+rw,o-rwx file.txt
sudo提升权限解决不可读等问题 ❗
作为 root 具有最高权限,所以这里能 cat 没问题;但是 root 同时也是 other,这里 other 无权限为什么能 cat 呢 ?
权限永远都是约束普通人的,root 是超级用户,它不受或几乎不受权限约束。这里的 owner、group、other 主要针对的是多个普通用户的情况。
Linux下文件后缀 ❗
之前说过 Linux 系统对于文件后缀是不关心的,注意这里指的是系统不关心不是某些工具。
这里把 a.out mv a.txt 后 a.out 和 a.txt 的结果是一样的。
如果我们把拥有者的 x 权限删除那么便不能执行了,因为我当前是文件的拥有者,那我也是所属组且有执行,为啥不让执行呢 ?—— 因为在审核权限时,优先使用拥有者。
2️⃣ 三位八进制数字
如上八进制数值表示方法
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
实例:
$ sudo chown root file.txt//修改拥有者
$ sudo chown wanghong file.txt//修改拥有者
$ sudo chown :wanghong file.txt//修改所属组
$ sudo chown wanghong:wanghong file.txt//可以将拥有者、所属组同时修改
$ sudo chown root:root file.txt//可以将拥有者、所属组同时修改
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
实例:
$ sudo chgrp root file.txt
$ sudo chgrp wanghong file.txt
功能:查看或修改文件掩码
格式:umask 权限值
说明:将现有的存储权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为 0022,普通用户默认为 0002
❓ 新建了一个 file 文件、dir 目录,是什么决定了它的默认权限 ❔
一般普通文件,起始权限从 666(rw- rw- rw-) 开始
一般目录文件,起始权限从 777(rwx rwx rwx) 开始
为啥它没按照一般情况来 ❓
因为在 Linux 中,在设置权限时,系统默认会有一个 umask 权限掩码
对于 0002 我们这里先不管第一个 0(它涉及后面的概念),其它位转成对应的二进制就是 000 000 010
umask 其中设定了一个概念:凡是在 umask 中出现的权限,都不应该在最终权限中出现
这里我们发现只有 other 里有一个写的权限,那么最终我们应该在 666(rw- rw- rw-) 或 777(rwx rwx rwx) 中去掉 other 的写权限,其中计算过程是:default & ~umask
实例:
所以换句话说我们在系统中设定的 umask 就可以进行更改默认权限了 ❗
之后我们再新建 file1.txt 和 dir1.txt 时,它们就无权限了:
对于 sudo 分配权限,咱后面再说,因为它需要改配置文件。
功能:辨别文件类型
语法:file [选项] 文件或目录
常用选项:
【面试题1】要在目录下创建文件,需要什么权限 ?
要在目录下创建文件,必须需要 w 权限。
【面试题2】要读取目录下的文件列表,需要什么权限 ?
要读取目录下的文件列表,必须需要 r 权限。
【面试题3】要进入一个目录,需要什么权限 ?
默认能进入:
删除 r 能进入:
删除 w 能进入:
删除 x 不能进入:
说明:
要进入一个目录必须具有 x 权限。
r 或 w 对于目录又影响什么呢 ❓
进入目录里查看文件、新建文件不能完成:
这里请转到上面两个面试题。
当前 owner、group 是 root,wanghong 是 other:
我作为 other 具有 rwx 权限,所以可以进入目录、查看、新建:
随后我们新建了若干文件(普通用户+root 用户)又把 root 的所有文件中 other 的权限删除:
对于 root 的文件,不能读、写、执行,因为作为一个普通人,人家的这个文件是 root 的,你不是 owner、group,甚至你作为 other,什么权限也没有,所以无可厚非。
但是作为一个普通用户我却可以删除 root 创建的文件:
可以看到当前所处的目录是 dir 下,我作为 other 是可读可写可执行的,上面面试题说了我要在一个目录下新建文件,必须得有写权限,同样,删除文件也必须得有写权限。如果说这样就可以以 other 的身份去删除 root 的文件,那么权限也太高了吧。
在一个公开的目录下 (rwx rwx rwx),不同的用户新建文件,既定事实是我们我们只能访问权限以内的文件,但我可以随意的删除。
root 能删别人的这能理解,但是普通用户能删 root 的不能理解 ?—— 这是既定事实,有人说这是 Linux 系统设计的 bug,当然应该算他把这块的权限放的比较大,当你要删除时,系统也提示你是否要移除一个携保护的常规文件。
那怎么防止普通用户删掉root的文件呢 ❓
同一个目录下,不同人创建的文件可能会被其它人删除,为了防止这种情况,可以给目录设置粘滞位。
注意这样做只可以防止普通用户删除 root 的文件,root 依然能删除普通用户的文件。
如果要直接删除目录,一定要先把内部的文件全部删除,同样,你要删内部的文件,前提是你必须先进入目录。
当一个目录被设置为粘滞位,则该目录下的文件只能由:
Linux系统中使用粘滞位的场景 ❓
在 Linux 系统中,有时会形成很多的临时文件 (一般在 /tmp)