Linux严格意义上说的是一个操作系统,我们称之为"核心(kernel)",
但我们一般用户,不能直接使用kernel。
而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。
操作系统本身是需要易用程度和安全性的
而对于我们使用电脑的普通用户来说,我们是不能直接访问操作系统的
为什么我们不能直接访问操作系统呢?
因为对于我们绝大多数人来说,我们对于操作系统并不熟悉,如果允许我们直接访问操作系统,势必会出现一些错误,所以需要有一个中间者
这个中间者的核心工作就是
将使用者的命令翻译给核心(kernel)处理。
同时,将核心的处理结果翻译给使用者。
在Linux中这个中间者就是shell外壳
在windows中这个中间者就是图形化界面
shell外壳的本质就是一个执行起来的程序(进程),在系统启动期间一直存在
1.当用户想要执行的指令有风险时(例如用户自定义的指令),shell都是通过创建子进程的方式去让子进程执行有风险的指令
2.对于低风险的指令,shell外壳会自己去执行
3.每一次你进行xshell登陆的时候,操作系统都要给你这个用户的当前登陆创建一个shell,bash
bash时shell外壳的一种,shell外壳还有其他的一些种类,bash属于shell外壳这个集合
Linux中的用户分为
1.root用户(超级管理员)
2.非root用户,也就是普通用户(xxx)
我们现在是root用户,想要切换为普通用户wzs
执行su wzs即可
无需输入wzs用户的密码
切换后当前所处目录不变
本质:退出root用户,以wzs用户的身份重新登陆,登陆后进入wzs用户的家目录
我们当前是wzs用户,执行su命令并输入root用户的密码后切换为root用户
并且我们所处的目录不变
我们当前是wzs用户,执行su -命令并输入root用户的密码后切换为root用户
所处目录更新为root用户的家目录
本质上来说就相当于退出当前用户并以root用户的身份重新登陆
这些命令需要使用root用户的身份去执行
在这里我们补充一个命令:adduser 用户名:添加用户
passwd 用户名:设置该用户的密码
userdel -r 用户名:删除用户
我们在这里使用root的身份新添加了一个用户zs
并且设置了这个用户的密码
我们现在是wzs用户,想要切换为zs
我们这里以su命令为例,su zs,并且输入zs的密码才可以切换为zs
而另一种方法是:从wzs用户切换为root用户,然后再切换为zs,这个过程只需要root用户的密码,不需要zs的密码
可见root用户的密码非常强大,非常重要,那么什么样的人才会具有root密码呢?
一般是管理员
如果一个普通用户不想把自己变成root,但是还想让我自己以root的权限执行一条命令
sudo 想要执行的命令(对指定的指令进行提权)
那么这个时候就有一个问题了,
如果我们输入sudo就可以以root用户的身份执行指定的命令,那么root用户的密码不就毫无意义了吗?
答案是:不是的,因为sudo命令不是一般用户能够执行的
比方说我现在是zs,我先使用root用户的身份执行ls命令,那么我就
sudo ls
结果:被拒绝了
只有一个用户的用户名在sudoers file这个配置文件中,才允许这个用户执行sudo
否则,不允许他执行sudo命令
那么如何把某个用户的用户名添加进sudoers这个配置文件中呢?
在学完vim的时候我们会进行介绍
在我们的日常生活中有各种各样的权限,所谓权限就一定是用来限制一部分人的操作的
例如:在CSDN上有一些文章只有vip才能看,leetcode上有些题是会员专属题只有会员才能做…等等等等
而且不同的应用程序或者网站场所等等都是只能提供一些特定的服务的
例如:
我们在爱奇艺当中就不能刷算法题,在leetcode中就不能看电影…等等等等
就算我们同时是爱奇艺和leetcode的会员,也无法做到这些事情
因为爱奇艺本来就无法刷算法题,leetcode本来就不能看电影
也就是说对于一些应用程序或者网站场所,它没有提供那个服务,就算我们权限是最高级别的,
也无法要求它去提供对应的服务
我们前面提到过Linux中一切皆文件
那么对于某个文件来说有三种身份角色
1.文件的拥有者
2.文件的所属组
3.other
大家可能会想了,文件的拥有者和other我知道为什么要有,但是为什么要有所属组呢?
我们未来的项目开发都是团队合作的,我们的代码很有可能也是需要被团队内部所能够访问的,因此为了区分团队内部成员跟other,Linux创建了所属组这个身份角色
而对于一个文件来说最重要的就是这三个属性:
r:读属性
w:写属性
x:执行属性
-rw-rw-r--
这个第一个-指的是test.txt这个文件不是目录文件
第2,3,4个分别是rw-:指的是文件拥有者对于这个文件拥有读,写权限,没有执行权限
第5,6,7个分别是rw-:指的是文件所属组对于这个文件拥有读,写权限,没有执行权限
第8,9,10个分别是r--:指的是other对于这个文件拥有读权限,没有写和执行权限
文件的详细属性(样例):
跟刚才举的现实生活中的例子相同的一点:
如果一个文件本来就没有执行的属性,就算你拥有这个文件执行的权限,你也执行不了这个文件,因为这个文件本来就不是一个可执行文件
所以Linux文件如果想要能够执行:
1.必须具有可执行权限x
2.它必须真的是一个可执行程序
u:user(文件的拥有者)
g:group(文件的所属组)
o:other
a:all(所有人)
+:添加对应权限
-:取消对应权限
rwx:读写执行权限
file:要修改权限的文件名
这里以test.txt为例:
例如我现在想要删除所有人的所有权限
例如我现在想要增加user的rwx权限
这时test.txt对于拥有者来说具有了执行权限,但是test.txt不是一个可执行程序
所以我./test.txt
去执行,没有任何反应
我们发现对于某个文件权限来说,这个文件权限一共有9个字符
对应到每个角色身上一共有3个字符,每个位置一共有两种状态,
一种是拥有这个权限,另一种是没有这个权限
如果我们用0来表示对应位置没有该权限,1来表示对应位置有该权限
所以我们可以用1个8进制数字来代表一个角色的权限,用3个8进制数字来代表整个文件的权限
例如:111:rwx权限都有
101:拥有r和x权限,没有w权限
所以我们可以这样去做
比方说我现在想设置test.txt的权限为:拥有者:rwx,所属组:r-x,other:—
对应到8进制表示为:750
没有作用
比方说我现在把test.txt的权限清空,转为root用户去添加内容,读取内容
丝毫没有任何约束
为了便于下面的操作,我新建了几个目录
那么我们来示范一下:
我现在想把这个文件给zs
但是给不了,为什么呢?
首先我们先明确一点:
那么怎么才能给他呢?
一般来说都是要用root去给,或者sudo指令提权
也就是这样:
使用root用户强制把这个文件给张三
那么能不能一起改呢?
答案是:可以的
当一个人同时是文件的拥有者和所属组时,会先匹配他是拥有者,然后只看他作为拥有者的权限,不去看他作为所属组的权限
当我把文件的拥有者给root之后,我只是文件的所属组,那我就拥有了对于这个文件而言所属组的r权限了
我们可以通过ll来查看Linux中的文件类型
我们先简单介绍一下链接文件和管道文件
我们先创建一个test.c文件
然后我们gcc编译一下test.c文件,并且把生成的可执行程序a.out重命名为mycmd
然后把mycmd移动到dir/dir1/dir2/dir3的路径中
那么这个时候如果我想要在当前这个目录就能去执行mycmd,
那么我们只能
这样的话就不是很好,有点太麻烦了
这个时候链接文件就可以派上用场了
显而易见,这个链接文件就相当于我们在windows系统中创建的快捷方式
而且,在Linux中跟在windows系统中一样,删除快捷方式并不会影响到原来的可执行程序
在现在而言,我们就把它简单地理解为是快捷方式,这个链接文件我们以后还会遇到的
管道文件跟我们之前介绍过的管道有非常紧密的联系,
我们可以先借助管道的作用来类比一下这个管道文件
如图,我们在第一个终端当中向管道文件mypipe中写入hello Linux.然后第一个终端就阻塞了.一直等到我们在另一个终端中接收这个hello Linux,
也就是说借助管道文件,我们就可以在两个终端之间进行信息交流了
管道文件和链接文件我们以后会详细介绍
Linux中的文件类型不通过后缀区分(但是:不代表Linux中后缀没有作用,后缀名还是有很大的作用的)
首先,Linux中文件类型不通过后缀名区分,这个怎么理解?
首先我们用nano在test.c文件中写了一段C语言代码
无论我怎么修改这个可执行文件a.out的名字,我都是可以直接运行的
这也就说明了Linux下的文件类型是不通过后缀区分的
你不是刚才说过Linux中的文件类型是不通过后缀名区分的吗?
你现在怎么又说Linux中的工具需要通过后缀名去区分文件类型呢?
注意:Linux和Linux中的工具不是一回事
这里的Linux指的是Linux操作系统,
Linux操作系统跟Linux上面的工具,指令,编译器并不相同,也不包含
也就是说,这两句话没有任何冲突,矛盾的地方
下面给大家看一下演示:
我们把test.c重命名位test.txt,然后gcc编译,发现报错,无法编译
这也就说明了Linux中的工具需要通过后缀名去区分文件类型
file 文件名
为了方便讲解,我们把mycmd.mp4和test.txt文件都删除了
只剩下了一个mydir目录文件
现在我身为mydir这个目录的拥有者,我可以进入mydir
查看mydir中的文件
在mydir中创建文件
在mydir中删除文件
下面我们分别去掉对应权限看一下这一连串操作有哪些会受到影响
不过再此之前,我们在重新创建test.txt文件,并向里面写入一些数据
我连ls命令都执行不了,也就是说我根本连查看这个目录当中有什么什么文件的权限都没有
那么我可以写文件吗?
创建一个文件可以,查看一个文件的内容也可以,甚至我也可以删除一个文件
但是我连这个目录当中有什么类型的文件都无法知道
对于目录文件而言
r:决定了是否可以进行对文件属性信息进行查看的权利(ll/ls -l)
我们无法新建一个文件,删除一个文件
但是可以查看一个文件的内容,修改一个文件的内容
对于目录文件而言
w:决定了是否可以在目录下进行新建和删除文件
我无法进入mydir,也无法查看里面的内容,也无法对里面的文件进行任何修改,无法新建和删除文件
对于目录文件而言:
x:决定是否可以进入该目录
我们新建一个普通文件和一个目录文件
然后ll查看他们的属性
发现我们创建的普通文件:默认的权限不是777,而是664
我们创建的目录文件:默认的权限不是777,而是775
为什么呢?
首先,我们知道如果一个普通文件有x权限,那么这个文件就有可能是可执行文件
而可执行文件只是这普通文件中的一种而已,占比并不大
所以Linux中的文件刚刚创建的时候,默认的权限应该是不带有x的
也就是说默认的起始权限应该是666
那么为什么是664呢?
我们又注意到,666和664的区别是:
666:对于other来说是rw-
664:对于other来说是r–
也就是说默认权限将other的w权限取消,这也合情合理,因为你other本来就不应该拥有能够修改我这个文件的权限
首先,对于一个目录文件来说,进入目录,查看目录内容,查看对应的文件内容,新建/删除/修改某个文件都是有必要的,因此起始权限应该是777
那么为什么要是775呢?
777:other:rwx
775:other:r-x
也就是说默认权限将other的w权限取消,这也合情合理,因为你other本来就没有不应该拥有能够在我的目录中新建,修改,删除文件的权限
那么Linux是怎么实现的呢?
是通过umask掩码来实现的
这个umask的作用是:定制一个文件被创建的时候的默认权限
我们可以通过umask命令来看一下对应的umask掩码
而且umask是可以修改的
比方说我想把它改成0003
然后我再去创建一个普通文件,一个目录文件
发现:普通文件:664,目录文件:774
那么它是怎么实现的呢?
然后我们可能会想:这还不简单,
直接相减不就ok了吗?
或者:
异或一下不就ok了吗?
首先我们先证明一下为什么异或不对
我们提到过umask等于0003时,
普通文件:664,目录文件:774
那么我们用异或和普通文件为例来推导一下
看能否得出664
异或得出665来,所以异或失败
其实,实现方法是:
这么神奇,其实原理是这样的
只有当文件权限为1并且umask对应位置的数据也为1时,才会将文件权限的那个1改为0
umask先按位取反后,
就只需要让文件权限为1并且umask对应位置的数据为0时,将那个1改为0,如果文件的权限为0,依然保持是0
也就是说只有当文件权限为1并且umask对应位置的数据也是1的时候,该文件的权限才会保持是1,否则就是0
这不就是按位与(&)运算吗
比方说有一天,root想要捉弄一下zs,但是"玩笑"开的太大了
什么玩笑呢?
root在zs的目录中创建了一大堆文件,
而且创建文件之后会还把这些文件的权限置为了000
关于这个shell脚本命令
我之前在Linux常见指令2中提到过
i=0; while [ $i -le 100 ]; do echo "hello $i";touch $i.txt; let i++;done
i=0; while [ $i -le 100 ];do chmod a-rwx $i.txt; let i++;done
权限是000,所以zs无法查看,修改这些文件,
但是root不受权限的约束,所以root可以随意操作这些文件
然后zs的工作环境非常糟糕,zs找了root很多次,root每次都是嘴上道歉,说一定会删了那些文件的,但是root没有一次真正去删过
后来zs受不了了,直接rm 全删了
可是那些文件zs没有任何权限啊,zs是怎么做到的呢?
因为这是zs的家目录,这个目录是zs的,zs作为这个目录的拥有者
拥有w权限,因此即使你root在我zs的目录下面捣乱,你建的文件,你把文件的权限全都关了,zs没法看,没法修改,但是zs能删除
也就是说:
一个文件能否被删除,并不取决于文件本身,而是取决于文件所处的目录的拥有者是否具有w权限!
而且我们系统的家目录本来就只允许这个家的主人(对应家目录的创建者)进入,所以一般情况下是不会出现我wzs在你zs的目录中创建文件的.所以两个普通用户之间基本是不会出现这种情况的
我wzs没法进入你zs的目录,你zs也没法进入我wzs的目录,可是如果我们现在有一个需求:
如果我们想要在一个特定的目录下面来实现文件的共享呢?
root创建了一个tmp目录,并且为了实现让多个用户之间可以数据共享,root将other的rwx权限全部放开
这里我们发现other的x权限被改为了t,这是为什么?
这个t就是粘滞位,我们为了凸显出粘滞位的作用
所以先把other的t这个权限去掉
然后我们让wzs和zs在tmp目录下共享文件
这里wzs创建了一个文件test.txt
往里面写了hello Linux
zs成功读取了test.txt文件
成功实现了wzs和zs共享文件的需求
但是呢,假设有一天,wzs和zs闹掰了
wzs把zs的权限关了,也就是把other的权限关了
zs没法读,没法写,zs一气之下把test.txt删了
在这里zs不该删的,就算zs真的想要删,也不应该让zs有这个权限去删除
但是为什么zs可是删除呢?
因为tmp这个目录对于other来说rwx的权限都放开了
zs和wzs都是other,都有w权限,因此都可以删除彼此的文件
Linux系统必然不能允许这种行为成功执行
因此引入了粘滞位这一解决方案
下面我们把other的t权限加上
我们再去重复一下刚才的操作
这个时候zs就删不了我wzs的文件了
那么粘滞位的作用是什么呢?
粘滞位:就是给目录中的other设置一个权限位,具有x的意义
同时也进一步对目录权限进行特殊限定:
该目录里面的文件,只有root和文件的拥有者才有权利进行删除
其他人一概不允许!
以上就是:Linux中的shell外壳与权限(包含目录文件的权限,粘滞位的来龙去脉) 的全部内容,
希望能对大家有所帮助!
最后,祝大家1024节日快乐!