1. 终端
当在我们需要操作服务器时要接上显示器和键盘,在键盘上输入、可以在显示器上看到。
我们把 显示器、键盘、鼠标等这些统称为 输入、输出的终端设备,或者把显示器和键盘这些统称作 终端。
![在这里插入图片描述](https://img-blog.csdnimg.cn/80b512770cb84840b957bd8cb81768f0.png)
当我们通过终端设备连接到服务器上并打开这些设备(如显示器)之后
以Linux系统为例将会启动login进程,这个进程用于用户认证,创建会话,login进程从我们的键盘接收内容,作为它的程序输入,而login进程通过标准输出把提示信息输出到显示器上,我们便可以进行交互。
当输入了用户名和密码后便能进入到操作系统。
![在这里插入图片描述](https://img-blog.csdnimg.cn/11d277a5be8d457b96b128cb09c004f1.png)
在完成登录操作后,login进程将会启动/bin/bash
或/bin/sh
进程,也就是我们常说的Shell。
用户通过Shell程序就可以和操作系统交互,完成需要的任务。
Shell程序同样也是使用 标准的输入输出设备(终端) 来与用户交互,例如键盘和显示器,这样我们采用够通过键盘输入命令,在显示器上查看我们输入的内容以及命令运行的结果。
在进入shell 后我们可以通过 ps
命令看到当前正在运行的进程,其中之一就是bash,终端设备为tty1
,它的后方也就是物理的终端设备(键盘、显示器)。
![在这里插入图片描述](https://img-blog.csdnimg.cn/03ebafb90257497fb825580e40ee9cb0.png)
通过 显示器 和 键盘 直接使用Linux系统的流程如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/bdc784460b5440ed89d1ebd25a87104d.png)
但是平时我们不会这样做,通常情况下都是在服务器上插上网线,然后使用ssh客户端通过网络远程连接并操作Linux操作系统。
2. SSH 与 伪终端
2.1 什么是SSH?
SSH是一个较为广泛的概念
- 他可以指 Secure Shell (SSH)协议
- 也可以指 ssh 客户端/服务端
SSH客户端/服务端是通过 SSH协议进行通信的程序。
![在这里插入图片描述](https://img-blog.csdnimg.cn/78e8d461dec64cf39313bd23e7be586e.png)
SSH协议栈
![在这里插入图片描述](https://img-blog.csdnimg.cn/eb5aa6aabb7e43e9affd857dc7b7e08a.png)
RFC标准将SSH架构分成三部分(如上图所示):传输层协议,用户认证协议,连接协议.
-
传输层协议SSH Transport Layer Protocol: 它负责认证服务器,加密数据,确保数据完整性, 虽然它运行在TCP之上,但其实它可以运行在任意可靠的数据流之上;
-
用户认证协议SSH User Authentication Protocol: 它负责认证使用者是否是ssh服务器的用户, Public Key Authentication登陆ssh就将在这一层实现;
-
连接协议SSH Connection Protocol: 它将把多路(Multiplex)加密的通道转换成逻辑上的Channel.
为了方便区分,这里把 SSH (大写)作为SSH协议,ssh (小写)作为客户端或服务端。
那我们是怎么通过ssh客户端与Linux服务器进行交互的呢?
这个就需要提到 伪终端
我们上文说用户通过鼠标键盘这些终端设备来操作系统,但是ssh服务端为运行于操作系统内一个软件,他并没有硬件,它是怎么完成输入输出,并把这些输入输出传回我们的ssh客户端的呢。
- 通过 伪终端实现输入输出。
- 通过 网络 和 SSH协议完成数据从服务端到客户端的传输。
2.2 什么是伪终端?
简单来说就是 操作系统提供虚拟的终端程序,可以对伪终端程序的输入输出、作为对操作系统的输入和输出。
它的结构如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/92b568e3859445a69f41a7baa684eb45.png)
[2] 通过man pts可以查阅linux对伪终端的介绍。伪终端是伪终端master和伪终端slave(终端设备文件)这一对字符设备。/dev/ptmx是用于创建一对master、slave的文件。当一个进程打开它时,获得了一个master的文件描述符(file descriptor),同时在/dev/pts下创建了一个slave设备文件。
master端是更接近用户显示器、键盘的一端,slave端是在虚拟终端上运行的CLI(Command Line Interface,命令行接口)程序。Linux的伪终端驱动程序,会把“master端(如键盘)写入的数据”转发给slave端供程序输入,把“程序写入slave端的数据”转发给master端供(显示器驱动等)读取。
- 伪终端总是成对存在
- master 负责 接收物理设备 或 其他进程的输入输出,并发输入输入作为 slave的输入输出
- slave负责 与 操作系统上的具体进程交互,例如Shell程序 bash/sh 或者其他程序如 login等,它将来自于master的输入和输入作为程序的标准输入和输出,输入到目标程序中。
- 对于slave的目标进程来说(
bash
) slave对它来说就和一个真实的终端一样。
平时我们只需要把 伪终端 看成黑盒,明白它可以吧输入输出转发到作为标准输入输出(stdin/stdout/stderr)目标程序即可。
2.3 ssh使用Linux
我们是怎么通过ssh客户端连接上服务端并操作的呢?
![在这里插入图片描述](https://img-blog.csdnimg.cn/0833436db0db49988e207a33838d9b97.png)
- ssh客户端 与 ssh 服务端 通过 SSH 协议建立连接
- ssh客户端 与 ssh 服务端 通过 SSH 协议进行身份认证
- ssh 服务端 伪终端 启动 shell程序
- ssh 服务端 通过SSH协议将来自伪终端的输入输出 传输至 ssh客户端
参考文献
[1]. 博客园 . Linux 终端(TTY) . sparkdev . 2019.09 . https://www.cnblogs.com/sparkdev/p/11460821.html
[2]. 博客园 . Linux 的伪终端的基本原理 及其在远程登录(SSH,telnet等)中的应用 . Pt Blog . 2017.09 . https://www.cnblogs.com/zzdyyy/p/7538077.html
[3]. Go进阶52:开发扩展SSH的使用领域和功能 . neochau . https://mojotv.cn/golang/ssh-pty-im
[4]. linux man . 2020-08 . https://man7.org/linux/man-pages/man4/pts.4.html