目录
首先我们先引出下面的概念帮助我们理解...
用户在Shell文本界面输入的指令本质上并不对Linux操作系统直接下达,而是通过一个中间媒介Shell进行翻译传递,这里我们将其称作外壳程序。这里的Shell我们可以将其理解为Windows系统中的GUI(图形化界面)。因此Linux操作系统可以从两个层面来理解:
广义上:Linux系统包含外壳程序和Linux内核
狭义上:Linux系统为Linux内核
这里的Shell是对外壳程序的一种统称,而非具体。就像我们日常生活中提到的医生、教师、程序员等是对一种职业或是一类人的统称,而非指的是具体的某个人。在Linux中具体的外壳程序是指bash进程,等同于就某种职业对应于具体的人。
Shell的作用:
1、传递请求指令,让OS执行指令
2、保护内核
当我们在进行用户登录时,Shell就会创建一个bash子进程,而Shell是bash统称,因此其本身就是一个进程。我们可以通过ps axj | grep bash指令来查看。
- [xxp@VM-24-3-centos lesson3]$ ps axj | grep bash
- 20306 3019 3018 20306 pts/0 3018 S+ 1004 0:00 grep --color=auto bash
- 20305 20306 20306 20306 pts/0 3018 Ss 1004 0:00 -bash
在Linux操作系统下存在着两类用户,分别是:
超级用户(root):拥有非常大的权限,可以在Linux下做任何事,不受限制
普通用户:拥有的权限是有限的,在Linux下做有限的事
上述提到的两类用户我们可以在命令编辑器shell上进行切换,假设此时我登录的是普通用户xxp(这是我自己创建的普通用户的命名), 我可以执行 su - 命令切换为超级用户root;当处在超级用户时可通过 su - 普通用户 切换为自己所创建的普通用户。如下:
- [root@VM-24-3-centos ~]# whoami
- root
- [root@VM-24-3-centos ~]# su - xxp
- Last login: Sun Aug 7 17:38:33 CST 2022 from 171.12.117.227 on pts/0
- [xxp@VM-24-3-centos ~]$ whoami
- xxp
- [xxp@VM-24-3-centos ~]$ su -
- Password:
- Last login: Sun Aug 7 18:00:28 CST 2022 on pts/0
- [root@VM-24-3-centos ~]# whoami
- root
但当我们需要频繁在超级用户root和普通用户之间进行切换时,并不建议上述提到的方法 ;原因是su -指令进行用户切换会使得Linux操作系统创建新的bash进程。如下:
- [root@VM-24-3-centos ~]# ps axj | grep bash
- 20305 20306 20306 20306 pts/0 25631 Ss 1004 0:00 -bash
- 24442 24445 24445 20306 pts/0 25631 S 0 0:00 -bash
- 24520 24521 24521 20306 pts/0 25631 S 1004 0:00 -bash
- 24604 24647 24647 20306 pts/0 25631 S 0 0:00 -bash
- 24647 25632 25631 20306 pts/0 25631 S+ 0 0:00 grep --color=auto bash
- [root@VM-24-3-centos ~]# su - xxp
- Last login: Sun Aug 7 18:00:41 CST 2022 on pts/0
- [xxp@VM-24-3-centos ~]$ su -
- Password:
- Last login: Sun Aug 7 18:01:01 CST 2022 on pts/0
- [root@VM-24-3-centos ~]# su - xxp
- Last login: Sun Aug 7 18:06:18 CST 2022 on pts/0
- [xxp@VM-24-3-centos ~]$ su -
- Password:
- Last login: Sun Aug 7 18:06:28 CST 2022 on pts/0
- [root@VM-24-3-centos ~]# ps axj | grep bash
- 20305 20306 20306 20306 pts/0 25894 Ss 1004 0:00 -bash
- 24442 24445 24445 20306 pts/0 25894 S 0 0:00 -bash
- 24520 24521 24521 20306 pts/0 25894 S 1004 0:00 -bash
- 24604 24647 24647 20306 pts/0 25894 S 0 0:00 -bash
- 25660 25662 25662 20306 pts/0 25894 S 1004 0:00 -bash
- 25728 25732 25732 20306 pts/0 25894 S 0 0:00 -bash
- 25792 25793 25793 20306 pts/0 25894 S 1004 0:00 -bash
- 25847 25857 25857 20306 pts/0 25894 S 0 0:00 -bash
- 25857 25895 25894 20306 pts/0 25894 S+ 0 0:00 grep --color=auto bash
查看上述代码不难看出,bash进程的数目随着我们对用户身份的切换逐渐增多,会造成对操作系统资源的浪费,为了避免这样的情况发生,我们可以通过用户回退的方式来进行用户的切换。其具体指令操作为(exit 或者 crtl + d)。
- [root@VM-24-3-centos ~]# ps axj | grep bash
- 20305 20306 20306 20306 pts/0 25894 Ss 1004 0:00 -bash
- 24442 24445 24445 20306 pts/0 25894 S 0 0:00 -bash
- 24520 24521 24521 20306 pts/0 25894 S 1004 0:00 -bash
- 24604 24647 24647 20306 pts/0 25894 S 0 0:00 -bash
- 25660 25662 25662 20306 pts/0 25894 S 1004 0:00 -bash
- 25728 25732 25732 20306 pts/0 25894 S 0 0:00 -bash
- 25792 25793 25793 20306 pts/0 25894 S 1004 0:00 -bash
- 25847 25857 25857 20306 pts/0 25894 S 0 0:00 -bash
- 25857 25895 25894 20306 pts/0 25894 S+ 0 0:00 grep --color=auto bash
- [root@VM-24-3-centos ~]# logout
- [xxp@VM-24-3-centos ~]$ logout
- [root@VM-24-3-centos ~]# logout
- [xxp@VM-24-3-centos ~]$ logout
- [root@VM-24-3-centos ~]# logout
- [xxp@VM-24-3-centos ~]$ ps axj | grep bash
- 20305 20306 20306 20306 pts/0 26659 Ss 1004 0:00 -bash
- 24442 24445 24445 20306 pts/0 26659 S 0 0:00 -bash
- 24520 24521 24521 20306 pts/0 26659 S 1004 0:00 -bash
- 24521 26660 26659 20306 pts/0 26659 S+ 1004 0:00 grep --color=auto bash
当用户回退到最后一个bash时,则会退出登录。
此命令主要是针对于普通用户而言,将其权限临时提升至超级用户root的级别(即对sudo所在的命令行进行权限提升)。
这时我们可以看出在普通用户下我们创建出了一个root.txt文件,而这个文件的创建者为超级用户root。但需要注意的是sudo命令起初并不能直接使用,需要对相应文件进行相关配置。
拥有者:owner - 文件的创建者
所属组:group - 可以理解为和文件拥有者同属一个团队的队友
其他人:other - 除去文件拥有者和所属组以外的人
上述序号①-④中,序号①表示文件类型,序号②-④分别对应文件拥有者、所属组、其他人对该文件的权限(r-读权限,w-写权限,x-可执行权限)。
注意:在Linux中,不以文件后缀来区分文件的类型(例如:.txt 、.c 等),而是以文件属性信息中起始位置的符号来标识文件类型,具体如下:
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
1、读(r/4): Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
2、写(w/2): Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
3、执行(x/1): execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
4、“—”表示不具有该项权限
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
常用选项:
R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
chmod 命令权限值的格式
① 用户表示符+/-=权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
为test.c文件的拥有者添加x可执行属性
对所有人为test.c文件的取消可读权限
对test.c文件赋予权限操作
注意:超级用户root可以随意的修改文件的权限(任何情况下)。
②三位8进制数字
每三位权限对应一种用户身份,且每位权限都是两态的,我们可以用8进制数字来表示权限设置,例如:
上述文件对应权限的三位8进制表示分别为:444、111、666。
功能:修改文件的拥有者
格式: chown [参数] 用户名 文件名
普通用户修改文件拥有者时需要将用户权限提升至超级用户root(sudo)。
chown可以同时改变拥有者和所属组。
功能:修改文件或目录的所属组
格式: chgrp [参数] 用户组名 文件名
常用选项: -R 递归修改文件或目录的所属组
功能:
查看或修改文件的权限掩码
新建文件夹默认权限=0666
新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask
格式: umask 权限值 (修改文件掩码)
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。
这里提出一个问题,我们会发现在默认情况下同一个用户所创建的相同类型文件所拥有的权限是相同的,那么这其中遵循着怎样的规则呢?
规则如下:
1、将权限掩码转化为二进制
2、对权限掩码按位取反
3、将取反后的权限掩码与文件起始权限按位与
实例如下:
功能说明:辨识文件类型。
语法: file [选项] 文件或目录...
常用选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试缩文件的去解读压内容。
可执行权限: 如果目录没有可执行权限, 则无法cd到目录中
可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容
可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件
当取消目录文件的r权限后,将无法查看文件内容,但是可以在该目录文件中创建文件。
当取消掉目录文件的x权限后
此外,有这样的一个问题,如果一个目录文件对others具有w权限,那么用户是否能够删除掉目录文件中的其它拥有者的文件?下面我们来验证。
通过验证我们发现,当一个目录文件对others具有w权限时,others用户可以删除该目录下的任何文件,包括不属于它的文件。但是这样并不合理,下面我们引入粘滞位的技术。
粘滞位技术就是限制others的权限,使其只能删除属于自己的文件。
如果目录本身对others具有w权限,那么others可以删除掉任何目录下的文件。
如果目录本身对others没有w权限,那么others则不可以删除文件。
那当我们有这么一种需求,others可以在特定的目录下创建自己的文件、写入自己文件、删除自己的文件,但是不想让他删除别人的文件。这时后这么办呢?
这时可以对目录添加一个粘滞位:【chmod o+t 文件名】,这个粘滞位只能对目录设置。一般是限制others的权限。对于设置了粘滞位的目录。在该目录下。只能文件的拥有者或root可以删除,其他人不能删除
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
1、超级管理员删除
2、该目录的所有者删除
3、该文件的所有者删除
1、当目录文件不具有x权限时,即使该目录文件具有r权限,也无法查看(不让看文件属性)
2、当目录文件不具有r权限时,即使该目录文件具有x权限,也无法查看(直接不让看)