目录
一、Linux操作系统
狭义上:就是指的Linux内核
广义上:Linux内核+Linux外壳和对应的配套程序
1、外壳程序:将用户输入的指令,解释传递给内核
2、内核执行命令,得到结果,将结果通过外壳传递给用户
其中包裹在操作系统外部用来执行指令传递和获取结果,其核心工作外壳程序不做指令的解释或执行只负责信息的传递把用户输入交给内核,内核再把执行结果返回给用户,把这种对应的外壳程序叫做命令行解释器。
在Linux中通常把命令行解释器统称为shell
shell外壳
1、命令解释 2、保护内核
外壳程序的一般工作原理:
创建子进程-->让子进程执行命令
父进程,继续进行命令行获取
shell命令以及运行原理
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。 而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
将使用者的命令翻译给核心(kernel)处理。 同时,将核心的处理结果翻译给使用者。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的 操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运 行出结果,通过shell解析给用户。
帮助理解:如果说你是一个害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头让你心动的小花。你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。
二、Linux权限的概念
Linux具体的用户:
1.root --- 超级管理员:可以再linux系统下做任何事情,不受限制
2.普通用户:在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
命令:su [用户名]
功能:切换用户。 例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令。
使用root新建/删除用户
新建:
adduser [用户名]
添加密码:
passwd [用户名]
删除:
userdel -r [用户名]
带-r删除干净
su 单纯的账号切换(exit)
就可以把当前对应的普通账号切换成root账号,但是工作路径还是普通用户的
su - 让root账号重新登陆(logout)
也可以,但是工作路径是root的
CTRL+D 登出当前账户
ls /home
看当前机器有哪些用户
root变成其他用户
直接su 【用户名】
sudo
如果我们只想用root账号执行一条命令,sudo对指令进行提权
sudo提权是有时间范围的,因此在sudo一段时间内不需要再次输入密码
问题:普通用户在sudo ls的时候会报错:
一般在Linux中,新建的普通用户是没办法执行sudo的。因为在Linux中存在一个配置文件,
etc/sudoers , 这个文件里会保存当前受信任的用户。(这个操作在后续文章中会进行解决)
三、Linux权限管理
文件访问者的分类(人)
文件和文件目录的所有者:u---User
文件和文件目录的所有者所在的组的用户:g---Group
其它用户:o---Others
所属组是什么?
一个组内可以只有一个人
一个组内可以有很多人,用组长的名字来对组命名
Linux文件类型
Linux区分文件类型,与后缀无关!
是和文件是否具有可执行权限有关 但是,Linux不对文件后缀做区分,但是不代表gcc(及其他)软件不做区分
Linux用第一列的第一个字符来区分文件的类型!!!
d:文件夹(目录文件)
-:普通文件(源代码,可执行程序,库等)
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
基本权限(后面的数字表示8进制数值表示方法)
读(--- r ---/ 4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
写(--- w ---/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
执行(--- x ---/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
“—”表示不具有该项权限
如果是rw就是4+1就写5,‘---’就是0
文件访问权限的相关设置方法
chmod
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项:
R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
chmod 命令权限值的格式
① 用户表示符+/-=权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
举例
这里还有一种可以更改文件属性的方法
可以看见这个文件属性第2 3 4位永远是关于拥有者的读 写 可执行操作,而每一个只有 r 或 - 两种状态,所以可以将他们这样看
--- : 000 0(转成8进制)
rw-: 110 6
r-- : 100 4
rwx : 111 7
为0为1代表该位置是否有对应的权限
所以在上面例子中rwxrwxr-x转成8进制就是775
综上可以使用8进制方案进行修改。
chown
功 能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
实例:
# chown user1 f1
# chown -R user1 filegroup1
直接给比尔正常情况是不被允许的。
解决方法A:
将文件扔给root
sudo chown [用户名] [文件名] 即可
方法B:
su 变成root账户就可以直接用chmod
chgrp
功 能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
和chown同理
因为拥有者和所属组改了对应的other就会跟着改,所以不需要有特别更改other的指令
chown root:root test 就可以同时对拥有者和所属组进行更改。
file指令:
功能说明:辨识文件类型。
语法:file [选项] 文件或目录...
常用选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试去解读压缩文件的内容。
默认权限
1.在Linux中创建 目录文件,起始权限:777
普通文件,起始权限:666
2.Linux系统中存在权限掩码
umask及掩码
功能:
查看或修改文件掩码
新建文件夹默认权限=0666(第一个0可以不用看,理解为8进制就行)
新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到 umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask
格式:umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用 户默认为0002。
002-> 000 000 010 ->凡是在权限掩码中出现的权限,最终都要在起始权限中去掉。
所以777就是111 111 111除去000 000 010
结论:最终权限 = 起始权限 去掉 权限掩码中出现的权限
而这个去掉是什么意思呢?可以发现在umask中如果是1的话,在正常生成的位置会被清0,如果原来是0就保持不动如:
最终权限 = 起始权限 & (~umask)
因为普通文件少了可执行所以是666
为什么一个目录文件还有wrx操作呢?
可以发现在Linux中进入一个目录需要x(可执行)权限
可以发现如果少了r后, cd进去不能显示当前目录文件有哪些内容
写显而易见就是不能进行目录文件内容增删
一个文件一定是属于一个目录的,一个文件能不能被删除,不是由该文件本身所决定,由所属目录与对应的账户是否具有w权限有关!
创建的目录文件是775也是因为,掩码为2,阻止了other的w操作。
一般而言,不同的账号,是不会在同一个目录下的!并且可以看到
只有拥有者有权限
特殊情况,如果我们多个账号想互相协同,共享一些数据呢???
root在(根目录 cd / 进入)创建一个文件,然后在chmod打开所有权限,这个时候另外两个other用户就都可以进入,协同工作了。(此时是两个other都互相进不了对方的home)
此时因为root加了rwx操作,所以两个other可以进去rwx,但是如果other-1不想让other-2读和写,chmod o-rw就可以了,但是因为在上级目录中有w,所以other-2可以直接给文件删了。
为了解决这个不科学的问题, Linux引入了粘滞位的概念。
粘滞位
chmod +t [文件名]
改了后x权限就会变成t
注意⚠️粘滞位,只能给目录进行设置。
一旦设置了后,只有文件的拥有者能够删除目录里的文件,但是root还是可以。