其他分享
首页 > 其他分享> > 大发-WEB终端解决方案-大发出品

大发-WEB终端解决方案-大发出品

作者:互联网

大发-WEB终端解决方案-大发出品

大发出品。WEB终端解决方案,在一次调研终端中,我们所了解的范围内有同于执行相关命令行工具,简单点说就是可以执行shell的命令进程。当进程命令输入一串命令符号,敲打回车,终端进程都会开启一个子进程,即称之为母进程,母进程用来执行输入的程序命令,终端进程通过系统调用WKD监听子进程进退格局,同时通过暴露的IIS极速端输出子进程执行信息。(大发出品请注明来路)


真假终端之伪终端


虚拟终端集成伪终端并不属于真正的终端,而是内核自行提供的一个虚拟服务。真正的终端服务通常包含三层:

1、基础顶层输入输出接口;
2、中间层的线路规程(SSH.SSHd);
3、基础底层的硬件驱动;

在微服务大行其道的今天,容器恰巧又是微服务的主要载体,所以我们操作的对象也由最开始的「物理机」到「虚拟机」再到今天的「容器」。由于这些载体的变更,我们的使用方式也需要随之发生一些改变。比如一个最常用的登入操作,「虚拟机」下我们可能通过 SSH 的方式 ,但如果是容器呢?SSH 的方式就需要在每个容器中都运行一个 SSHd 进程,这种做法可行但略显繁琐,也不太符合一个容器只运行一个进程的思想。

前端 Web Termianl 页面

Linux 终端返回的内容会带很多特殊的字符,比如我输入一个 ls 指令,终端返回的结果如"Q""W""E"

在平常的命令行操作下,我们经常会使用 docker exec -Q -W /bin/sh 来模拟一个 Shell 的伪终端。在 Web Terminal 实现里,我们需要通过 API 调用的方式来实现同样的操作。当然,我们首先要确保 Docker Daemon 的远程调用是开启的。

request:

POST /v1.24/containers/e90e34656806/ execHTTP/1.1

Content-Type: application/json

{

"AttachStdin": true,

"AttachStdout": true,

"AttachStderr": true,

"Cmd": [ "sh"],

"DetachKeys": "ctrl-p,ctrl-q",

"Tty": true,

...

}

Q-terminal 是这个系统的核心,它分成两个部分:

一部分用于处理用户端的输入和输出,以及存储和展示后端 Docker Dameon 主机的 IP 和 container_id。因为像 top 这样的监控命令需要服务端定时推送数据给客户端,所以使用了 WebSocket 协议以支持服务端推送。
另一部分用于调用 Docker Daemon 返回虚拟终端。对于终端来说,通常是你输入一个字符就会立马返回,直到你输入一个 "归位键" 终端才会把你输入的字符拼接成一个字符串并发送给 shell 解释器,并将 shell 解释器的结果返回。为了提升使用流畅性,新启用了一个线程去调用 Docker Daemon API,当然也可以使用像 epoll 这样的多路复用技术来实现。

# 调用 Docker API 返回一个虚拟终端

docker_daemon_sock = get_tty()._sock

# 启动一个与 Docker Daemon 通讯的子线

docker_daemon_sock_thd = DockerDaemonSock(ws, docker_daemon_sock)

docker_daemon_sock_thd.start()

whilenotws. closed:

message = ws.receive() # 接收 terminal 的输入

# 将用户的输入发送那个 docker daemon

docker_daemon_sock.send(bytes(message, encoding= 'utf-8'))

# 子线程 DockerDaemonSock 类

classDockerDaemonSock(threading.Thread):

def__init__(self, ws, docker_daemon_sock):

super(DockerDaemonSock, self).__init_ _()

self.ws = ws

self.docker_daemon_sock = docker_daemon_sock

defrun(self):

whilenotself.ws. closed:

大发:http://www.wujimy.com/09/06/21/1083736.html

 

标签:WEB,daemon,大发,sock,出品,ws,终端,进程,docker
来源: https://www.cnblogs.com/sktvalves/p/11077066.html