当在我们需要操作服务器时要接上显示器和键盘,在键盘上输入、可以在显示器上看到。
我们把 显示器、键盘、鼠标等这些统称为 输入、输出的终端设备,或者把显示器和键盘这些统称作 终端。

当我们通过终端设备连接到服务器上并打开这些设备(如显示器)之后
以Linux系统为例将会启动login进程,这个进程用于用户认证,创建会话,login进程从我们的键盘接收内容,作为它的程序输入,而login进程通过标准输出把提示信息输出到显示器上,我们便可以进行交互。
当输入了用户名和密码后便能进入到操作系统。

在完成登录操作后,login进程将会启动/bin/bash 或/bin/sh进程,也就是我们常说的Shell。
用户通过Shell程序就可以和操作系统交互,完成需要的任务。
Shell程序同样也是使用 标准的输入输出设备(终端) 来与用户交互,例如键盘和显示器,这样我们采用够通过键盘输入命令,在显示器上查看我们输入的内容以及命令运行的结果。
在进入shell 后我们可以通过 ps命令看到当前正在运行的进程,其中之一就是bash,终端设备为tty1,它的后方也就是物理的终端设备(键盘、显示器)。

通过 显示器 和 键盘 直接使用Linux系统的流程如下:

但是平时我们不会这样做,通常情况下都是在服务器上插上网线,然后使用ssh客户端通过网络远程连接并操作Linux操作系统。
SSH是一个较为广泛的概念
SSH客户端/服务端是通过 SSH协议进行通信的程序。

SSH协议栈

RFC标准将SSH架构分成三部分(如上图所示):传输层协议,用户认证协议,连接协议.
为了方便区分,这里把 SSH (大写)作为SSH协议,ssh (小写)作为客户端或服务端。
那我们是怎么通过ssh客户端与Linux服务器进行交互的呢?
这个就需要提到 伪终端
我们上文说用户通过鼠标键盘这些终端设备来操作系统,但是ssh服务端为运行于操作系统内一个软件,他并没有硬件,它是怎么完成输入输出,并把这些输入输出传回我们的ssh客户端的呢。
简单来说就是 操作系统提供虚拟的终端程序,可以对伪终端程序的输入输出、作为对操作系统的输入和输出。
它的结构如下:

[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端供(显示器驱动等)读取。
bash) slave对它来说就和一个真实的终端一样。平时我们只需要把 伪终端 看成黑盒,明白它可以吧输入输出转发到作为标准输入输出(stdin/stdout/stderr)目标程序即可。
我们是怎么通过ssh客户端连接上服务端并操作的呢?

[1]. 博客园 . Linux 终端(TTY) . sparkdev . 2019.09 . https://www.cnblogs.com/sparkdev/p/11460821.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