目录
XShell的介绍
Shell的运行原理
Linux当中的权限问题
Linux权限的概念
Linux权限管理
文件访问者的分类(人)
文件类型和访问权限(事物属性)
文件权限值的表示方法
文件访问权限的相关设置方法
如何改变文件的访问权限
如何改变文件的拥有者
如何改变文件的所属组
如何修改文件的掩码
目录的权限
粘滞位
XShell的介绍
首先,先介绍一下我们学习Linux的工具:Xshell
XShell 是一个流行的 Windows 平台上的 SSH、Telnet 和 Rlogin 客户端,主要用于远程连接 Linux/Unix 系统。它的运行原理大致如下:
-
1:协议支持: XShell 支持多种远程协议(如 SSH、Telnet、Rlogin 等)。最常用的是 SSH 协议,它提供了安全的加密通信。SSH(Secure Shell)通过加密对客户端和服务器之间的通信进行保护,以防止数据在网络中被窃听和篡改。
-
2:建立连接:
- 当用户启动 XShell 并配置好远程主机信息(如 IP 地址、端口、用户名等)后,XShell 会尝试通过指定的协议与远程服务器建立连接。
- 如果使用 SSH 协议,XShell 会首先与远程主机建立 TCP 连接(默认端口是 22)。然后,客户端和服务器之间会通过 SSH 协议进行身份验证,确保通信的安全性。
-
3:身份验证:
- 对于 SSH 连接,XShell 会使用密码或公私钥对进行身份验证。公私钥对认证方式比密码更加安全,XShell 会首先发送客户端的公钥给服务器,服务器使用自己的私钥进行验证,如果认证通过,则建立安全的通信通道。
-
4:数据传输:
- 一旦建立连接并完成身份验证,XShell 就会通过 SSH 或其他协议开始数据传输。在通信过程中,所有传输的数据都会被加密,以保证数据的机密性。
- XShell 主要用于发送终端命令并接收响应,它将用户输入的命令通过协议发送给远程主机,然后显示远程主机的执行结果。
-
5:终端仿真:
- XShell 提供的终端界面是一个仿真终端(如 VT100、Xterm 等),使用户能够与远程系统交互。它会将远程主机的命令行界面转发到本地显示,并将用户的输入发送到远程主机。
- 它还支持多种文本编码、颜色主题和脚本功能,用户可以根据需要自定义界面和操作。
-
6:会话管理:
- XShell 支持多会话功能,可以同时打开多个连接到不同服务器的终端窗口,并通过标签或选项卡管理每个会话。用户可以在不同的终端窗口之间切换,方便管理多个任务。
-
7:文件传输:
- XShell 提供了与远程主机进行文件传输的功能。通过集成的 SFTP(SSH 文件传输协议),用户可以通过图形化界面在本地计算机和远程服务器之间传输文件。
XShell 的工作流程简要总结:
- 用户启动 XShell,输入远程服务器的连接信息(如 IP 地址、协议、用户名、密码等)。
- XShell 通过指定的协议(如 SSH)与远程主机建立 TCP 连接。
- 进行身份验证(密码或公私钥认证),如果成功,则建立安全的连接。
- 用户输入命令,XShell 通过协议将命令传输到远程主机并显示返回结果。
- 支持文件传输和多会话管理,方便用户在不同的远程主机之间进行操作
但是这些只需要知道即可,不需要去特别记忆与深入了解
那么说完Xshell,那么就要跟它名字特别像,但是完全不一样的Shell了。
Shell的运行原理
根据上面的Xshell的介绍,我们知道,XShell 和 Shell 之间有一些本质的区别,尽管它们都与命令行操作和远程连接有关。我们可以从功能、用途、技术实现等多个方面来对比它们。
XShell 是一个 第三方 SSH/Telnet 客户端,它是一个 图形化终端仿真器,用于在 Windows 平台上远程连接到 Linux、Unix 或其他操作系统的 Shell 环境。XShell 提供了一个可视化的界面,使用户能够使用 SSH、Telnet 等协议连接到远程服务器,并通过终端窗口与远程系统的 Shell 交互。
但是Shell 是一个命令行解释器,主要用于与操作系统交互。它接收用户输入的命令并将其传递给操作系统进行处理,然后返回输出结果。Shell 本身是操作系统的一部分,常见的 Shell 包括 Linux 中的 Bash、Zsh、Ksh 等,以及 Windows 中的 Command Prompt(CMD)和 PowerShell。
那么shell的真实运行原理是上面样子的呢?
我们都知道Windows以图形化界面为交互方式,而Linux以命令行界面为交互方式。Windows和Linux的交互方式虽然不同,但本质上是一样的,图形化界面和命令行界面都是为了让用户进行相关操作,而图形化界面和命令行界面就是我们所说的“外壳程序”。
Linux严格意义上说是一个操作系统,我们称之为“核心(kernel)”,但我们一般用户不能直接使用kernel,就算可以使用,如果出了问题,那么就对于普通用户来说十分难以解决。而是通过kernel的“外壳程序”,也就是所谓的Shell,来与kernel沟通,所以说Shell就相当于中间人,负责二者的交互,所以Shell也叫做命令行解释器。
换个角度从Windows上解释:
对比Windows中的图形化界面(GUI),我们操作Windows并不是直接操作Windows内核,而是通过图形接口,点击,从而完成我们的操作。Shell对于Linux具有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核,反馈结果再通过内核运行出结果,通过Shell解析给用户。
同样对于手机的操作系统(如 Android 或 iOS)虽然它们的架构和桌面操作系统(如 Linux 或 Windows)有些不同,但也存在类似的层次结构和概念。在手机操作系统中,Kernel 和 Shell 也扮演着类似的角色,不过由于手机操作系统的设计和使用环境的不同,它们的实现和使用方式也有所不同。
在手机操作系统中,用户通常不会直接与 Kernel 交互,而是通过 Shell 或图形用户界面(GUI)来与操作系统交互。
Shell运行原理:
- 创建子进程,让子进程进行命令行解释。
- 子进程出现任何问题,都不影响父进程Shell。
从windows方面解释,就是我们规定上所有的程序都有一个共同的父进程,我们每运行一个程序就是创建了一个它的子进程,例如,登录微信、QQ,steam。而这些子进程当中任何一个进程出现问题,都不会影响父进程,例如,当你的微信出现卡死情况(程序异常)或你的微信被关掉(程序终止),但其他子程序仍然可以运行。
当然在windows下我们可以查看自己电脑上的所有子进程
注意: Shell只是所有外壳程序的统称,例如在centos 7当中的外壳程序名叫bash。
Linux当中的权限问题
Linux权限的概念
在Linux中用户一般分为两大类,分别为普通用户与超级用户(root),在Linux中,超级用户可以干任何事情,是不受任何限制,并且对于一个系统来说,有且只有一个。与之相对的就是普通用户,普通用户可以有多个,每个普通用户只可以在自己的工作目录下(/home/xxx)工作,以及在系统上做有限的工作。
换句话来说,所有的权限的概念都是用来限制普通用户的,而超级用户几乎不受限制。
在XShell中如何分辨是超级用户还是普通用户也十分的简单
超级用户的命令提示符是“#”。
普通用户的命令提示符是“$”。
除了如何简单辨别外,还有很多相关用户的操作,这里就不在说了,我上一篇的文章中有详细介绍,还有图示操作。
Linux下进行用户的切换与创建以及细微设置_linux切换用户-CSDNhai
这里就从sudo方面来简单解释一下权限。
sudo作为提升普通用户的“权力”的指令,他可以sudo修改别的普通用户的账号密码。
但是我们知道对于一个新创建的普通用户,是不允许使用sudo指令的,这样不难理解,如果你买了一个云服务器,然后使用XShell学习Linux,突然有一天你的同学李四说,“你不是买了一个云服务器么,让我使用下可以么?我可以分担云服务器的价钱”,然后你就同意了,假如,李四创建了一个普通用户,他这个普通用户在进行sudo的操作时,不受任何的限制,那么那天李四修改密码,修改错了,把你的修改了,你登不上了,然后李四又不知道自己修改错了,那这就很麻烦。所以为了避免一系列这样的问题,这就引入了对于普通用户权限的限制问题,如果操作系统不信任的普通用户,是不允许sudo的,解决方法也很简单,原理上就是将该用户设置为白名单。
详细操作可以看上篇文章。
这就是权限的简单解释。
Linux权限管理
文件访问者的分类(人)
对于所有用户(包括超级用户)来说,权限可以将用户分为三大类:
- 文件和文件目录的所有者(文件拥有者)。
- 文件拥有者所在的组的用户(文件所属组)。
- 其他用户(other)。除了文件拥有者和文件所属组之外的都叫other。
需要注意的是:
- 对于某个文件而言,文件的拥有者、所属组和其他用户的权限是由超级用户(root)和普通用户的身份决定的。
- 在Linux中,每个用户都必须隶属于某个组,即使该组只有该用户一个人(此时该组的名称通常会与用户的用户名相同)。
这样的权限管理方式有助于更加细粒度地控制文件和目录的访问权限,确保系统的安全性与灵活性。
那么为什么会有所属组这个概念呢?
下面举个例子。
你在毕业后进入了某家公司,在该公司以后的工作中,你所在的公司将继续致力于推进这款项目的开发,尤其是在我们A组与B组之间的合作和竞争中。A组和B组在同一台Linux服务器上并行开发,采用赛马模式,即每个小组各自独立开发同一项目的不同功能模块或解决方案,最终通过对比效果来决定哪一组的成果能够获得更广泛的采用。
你作为A组的一员,在A组的开发过程中,我们主要关注以下几个方面:
1:对于组内权限管理
在Linux权限管理的角度来看,我们首先根据项目的目标和需求,将工作进行详细拆解,确保每个成员都有明确的任务和交付物。在A组内部,我们进一步划分为多个小组,例如A1小组负责编写代码,A2小组负责撰写文档,A3小组负责与客户沟通等。这些小组都隶属于A组,因此从Linux的角度来看,A1、A2、A3等小组都共享A组的组权限,属于同一个文件所属组。
2:对于不同组之间的权限管理
虽然所有成员都在同一家公司工作,但对于B组的成员来说,A组的工作质量越差,B组的利益就越大。这并不难理解,因为如果A组的表现优于B组,那么B组就会面临竞争压力,甚至可能失去部分机会。因此,在Linux权限管理中,B组可以被视作“other”(其他用户)。B组成员不仅无法访问A组内部的文件,甚至不得干扰或破坏A组的工作成果。这种权限管理确保了A组和B组之间的隔离,从而保护各自的利益和数据安全。
所以总的来说在Linux中存在这样的设定是十分必要的。
如果没有所属组的概念,那么当你创建了一个文件后,要么就是只有你自己(拥有者)能看到,要么就是其他人(other)也都能看到。而你所希望的是你自己和你的小组成员能看到,剩下的人看不到。
于是就有了所属组这个概念,这时你就可以将文件设置为拥有者和所属组可见,而other不可见。然而这不单单是对于公司内中不同普通用户写的代码只允许自己看的问题,这更是涉及到了自己的代码不能让他人(other)去改!!!
所以所属组的存在是为了更灵活的进行权限配置,满足团队协作。
我们可以通过指令ll来查看某一文件或文件目录的拥有者和所属组。
文件类型和访问权限(事物属性)
权限涉及到某个具体的事物来说,我们还需要讨论事物本身的属性。对于文件来说,我们应该讨论其文件类型,以及是否具有可读、可写和可执行的属性。
在上图中,使用指令ll,我们不免会注意到左边的那前面有一串字符,这串字符实际上就代表着该文件的类型和属性。
这串字符由10个字符组成的。其中第一个字符所代表的就是该文件的文件类型。
其中不同的字符代表不同的文件类型。
1)-:代表普通文件。
2)d:代表目录。
3)l:代表链接文件(类似于Windows当中的快捷方式)。
4)b:代表块设备文件(例如硬盘、光驱等)。
5)p:管道文件。
6)c:字符设备文件。
7)s:套接口文件。注意: 在Linux当中,文件类型与文件后缀无关。
剩下的9个字符每三个为一组,分别代表该文件相对于其拥有者、所属组以及other是否拥有某种属性。
不同的字母组合有着不同的作用
就比如图中,第一个字符代表该文件对于拥有者的权限为:拥有进行可读可写可执行的权限属性,第二个代表是所属组的权限为:拥有进行可读可写可执行的权限属性,第三个代表是对于其他者的权限为:拥有可读课执行的权限属性。
现在我们来阐述一下该文件的类型以及权限。
对于图中的test.txt,通过第一个字符为 - 得知,其是一个普通文件。该文件的拥有者和所属组对其都是可读可写的权限属性,但该文件的other对其只有读的权限属性。
文件权限值的表示方法
字符表示方法
ll指令打印文件权限值时的表示方法就是字符表示法。例如
八进制数值表示法
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。例如
文件访问权限的相关设置方法
然而对于上面文件的访问权限设置全为系统默认情况下的,对于不同使用者,难免会存在不满意的情况,所以在Linux下就允许用户自己修改文件的访问权限
如何改变文件的访问权限
指令:chmod
语法: chmod 选项 权限 文件名或目录名
功能: 设置文件的访问权限。
常用选项: -R 递归修改目录文件的权限。
chmod指令权限值的格式:
格式一: 用户符号 +/-/= 权限字符
1)+:向权限范围增加权限代号所表示的权限。
2)-:向权限范围取消权限代号所表示的权限。
3)=:向权限范围赋予权限代号所表示的权限。
用户符号:
1)u:拥有者。
2)g:所属组。
3)o:other。
4)a:所有用户。
若要同时设置不同类用户的访问权限,则需用逗号隔开。
格式二: 三位八进制数字
将对应的八进制数转换为二进制,进而设置对应权限值。
如何改变文件的拥有者
语法: chown 选项 用户名 文件名或目录名
功能: 修改文件的拥有者。
常用选项: -R 递归修改目录文件的拥有者。
所以从上面结果来说:修改文件的拥有者需要root用户进行操作,若是普通用户则需要进行权限提升。
如何改变文件的所属组
语法: chgrp 选项 用户名 文件名或目录名
功能: 修改文件的所属组。
常用选项: -R 递归修改目录文件的所属组。
同样需要注意的是:修改文件的所属组也需要进行权限提升 。这里就不在演示了
如何修改文件的掩码
我们上面也说了,每个文件与目录在创建的时候都会存在一个默认的权限,这是我们在创建文件的时候都可以看到的,并且同一类文件的默认权限都是一样的。
我们看上图也不难看到后三个文件刚创建的时候权限都是默认一样的,第一个作为目录又与文件不同。
所以说,在实际上,新建文件的默认权限为0666,新建目录的默认权限为0777。其中第一位的0与特殊权限有关,我们这里不必深究,而后面三位就是权限的八进制数值表示方法,我们将其翻译为字符表示方法。
但实际上,把666翻译为字符表达方式rw-rw-rw-,看到的权限往往不是上面的这个值,原因就是在创建文件或目录的时候还要受到umask的影响。假如说默认权限为mask,则实际创建出来的文件权限就为:mask&~umask(&为二进制运算符:全一则1,有0则0)。
关于umask是什么呢
格式:umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预定权限。超级用户默认掩码值为0022,普通用户的默认为0002。
语法: umask 权限值
功能: 查看或修改文件掩码。
我们可以通过指令umask查看文件默认掩码。
因此我们实际创建出来的文件和目录的权限值还需要进行进一步换算才能得出。首先我们将掩码的的后三位八进制换算为二进制,然后对其进行按位取反。
然后将之前的新建文件的默认权限值与其进行按位与操作,得到的二进制数,然后再转化为字符表示法,那么就会对应的是rw-rw-r--。
还拿上面的案例进行比喻,在公司分组中,我们作为A组的,是不希望other(B组)的任何人拥有查看我们的文件的权限,所以,我们也可以通过修改umask来设置文件的访问权限。
目录的权限
对于文件来说,其可读可写可执行的属性我们都知道分别代表着什么对应的操作,那对于目录来说可读可写可执行又分别代表着什么呢?
1)可读权限: 如果用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容。
2)可写权限: 如果用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件。
3)可执行权限: 如果用户没有该目录的可执行权限,则无法通过cd指令进入到目录当中。
那么这就会出现一个问题:
还是拿上面的案例比喻,我们作为公司中A组的一员,如果说A组内有一个人有着不想干的想法,而且这个想法还恰好被B组的某位人知道了,那么作为A组的那位人就是B组的卧底,他就拥有权限删除你写的代码。这是非常不合理的。
那个卧底用户只要拥有某目录的可写权限,就可以删除该目录当中的文件,而不论该用户是否拥有该文件的可写权限,这显然是不合理的。
为了解决这个不合理的问题,Linux引入了粘滞位的概念。
粘滞位
语法: chmod +t 目录名
功能: 给目录加上粘滞位。
当一个用户将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符“t”。
此时另一个用户就算有该目录的可写权限,也无法删除该目录下的文件。
当一个目录被设置为粘滞位,则该目录下的文件只能由:
1)超级用户删除。
2)该目录的拥有者删除。
3)该文件的拥有者删除。
注意: 虽然目录被加上了粘滞位,但如果用户有该目录的可写权限,则不影响其在该目录下创建文件