gin框架使用websocket实现进入容器内部执行命令

文章目录

  • 1. 先决条件
  • 2. gin框架实现
  • 3. 测试用html文件
  • 4. 需要完善

1. 先决条件

docker开放远程API端口

2. gin框架实现

type GetCommandResultRequire struct {
	IpAddr        string `json:"ip_addr"` //传入要控制容器的ip地址
	ContainerUuid string `json:"container_uuid"` //容器id
}

func GetCommendResult(c *gin.Context) {

	var sendCommandRequire GetCommandResultRequire
	sendCommandRequire.IpAddr = c.Query("ip_addr")
	sendCommandRequire.ContainerUuid = c.Query("container_uuid")

	//升级接口
	ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)
	if err != nil {
		fmt.Print("升级websocket连接错误:", err)
		return
	}
	defer ws.Close()

    execHr := new(types.HijackedResponse)
	dockerCli, err := ConnectDocker(sendCommandRequire.IpAddr)
	if err != nil {
		tools.SetErr(c, 500, err, err.Error())//此处是自己实现的gin返回
		return
	}

	//启动携程,持续接收信息、传入命令、异常关闭docker链接
	go func() {
		for {
			_, message, err := ws.ReadMessage()
			if err != nil {
				logger.Error("接口断开:", err)
				execHr.Close()
				ws.Close()
				return
			}
			logger.Info(string(message))
			//发送命令
			err = SendCommend(string(message), execHr)
			if err != nil {
				logger.Error("命令发送错误")
			}
		}
	}()

	err = ExecContainer(dockerCli, execHr, ws, sendCommandRequire.ContainerUuid)
	if err != nil {
		tools.SetErr(c, 500, err, err.Error())
		return
	}
	logger.Info("链接关闭")
}

//定义一个函数,链接容器,并持续输出。
func ExecContainer(dockerCli *client.Client, execHr *types.HijackedResponse, conn *websocket.Conn, containerId string) error {

	ctx := context.Background()
	// 在指定容器中执行/bin/bash命令
	ir, err := dockerCli.ContainerExecCreate(ctx, containerId, types.ExecConfig{
		AttachStdin:  true,
		AttachStdout: true,
		AttachStderr: true,
		Cmd:          []string{"/bin/sh"},
		Tty:          true,
	})
	if err != nil {
		return err
	}

	// 保持链接
	*execHr, err = dockerCli.ContainerExecAttach(ctx, ir.ID, types.ExecStartCheck{Detach: false, Tty: true})
	if err != nil {
		return err
	}

	//关闭I/O
	defer execHr.Close()

	// 输入一个测试命令(非必要)
	_, err = execHr.Conn.Write([]byte("ls\r"))
	if err != nil {
		return err
	}

	// 输出
	scanner := bufio.NewScanner(execHr.Conn)
	for scanner.Scan() {
		fmt.Println(scanner.Text())
		text := scanner.Text()
		b, _ := json.Marshal(text)
		err = conn.WriteMessage(websocket.TextMessage, b)
		if err != nil {
			log.Println("写入错误", err)
			//return err
			continue
		}
	}
	logger.Info("容器输出结束")
	return nil
}

//写一个函数,向容器中发送命令。
func SendCommend(cmdString string, execHr *types.HijackedResponse) (err error) {

	_, err = execHr.Conn.Write([]byte(cmdString + "\r"))
	if err != nil {
		return
	}
	return nil
}

3. 测试用html文件

仅是一个测试文件,很丑,但是后端测试够了。

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>TestWebsocket</title>
 
    <script type="text/javascript">
        var Server_Com;
        function LinkServer() {
            // 声明连接
            
            if ("WebSocket" in window) {
                Server_Com = new WebSocket("ws://127.0.0.1:18000/v1/m6e/docker/container/exec?ip_addr=10.10.239.32&container_uuid=48bcf6811212");
                console.log("新建连接到->127.0.0.1:18000");
            }
 
            // 建立连接后发送
            Server_Com.onopen = function() {
 
                Server_Com.send("Hello Server!"); // Web Socket 已连接上,使用 send() 方法发送数据
                console.log("已连接上服务器");
            }
 
            // 接收服务器消息
            Server_Com.onmessage = function(event) {
                var recv_msg = event.data;
 
                if (recv_msg == "Hello Client!") {
                    console.log("接收到服务器的问候: " + recv_msg); // 用于提示收到信息
                } else {
                    document.getElementById("Time").textContent = document.getElementById("Time").textContent + "\r\n" + recv_msg; // 实时更新显示服务器发回的时间
                    console.log("接收到服务器数据: " + recv_msg);
                }
            }
        }

        function SendMessage(){
            var inputMessage = document.getElementById("sendcmd").value;
            Server_Com.send(inputMessage);
        }
    </script>
</head>
 
<body>
    <p>接收到的信息:</p>
    <p id="Time">crow-exec测试</p>
    <button onclick="SendMessage()">发送消息</button>
    <input id="sendcmd" name="sendcmd"></input>
    <button onclick="LinkServer()">连接</button>
 
</body>
</html>

4. 需要完善

vi 编辑器无法实现,需要进一步完善。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/2552.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何利用学生身份申请使用免费的专业版pycahrm(详细 教程)

一、申请大学邮箱 不同的大学申请的方式可能有所不同&#xff0c;如果不知道的话可以直接在百度上搜&#xff1a;如何申请XXX大学的邮箱账号。 二、进入官网进行完成学生认证 1.Buy PyCharm Professional: Pricing and Licensing, Discounts - JetBrains Toolbox Subscripti…

Windows权限提升 —SQL Server/MSSQL数据库提权

Windows权限提升 —SQL Server/MSSQL数据库提权1. 简介2. 环境准备2.1. SQL Server介绍2.2. SQL Server安装2.2.1. 主程序安装步骤2.2.1.1. 双击SQL EXPR2.2.1.2. 实例配置2.2.1.3. 服务器配置2.2.1.4. 数据库引擎2.2.1.5. 安装完成2.2.2. 管理程序安装2.2.2.1. 安装插件2.2.2.…

Selenium+Pytest自动化测试框架实战,还不会点这里一清二楚,全网最细教程!

如果下方文字内容没有看明白的话&#xff0c;我推荐大家看一套视频&#xff0c;比文字内容讲的更加详细&#xff01; 在华为工作了10年的大佬出的Web自动化测试教程&#xff0c;华为现用技术教程&#xff01;_哔哩哔哩_bilibili在华为工作了10年的大佬出的Web自动化测试教程&a…

基于点云的深度学习方法预测蛋白-配体结合亲和力【Briefings in Bioinformatics, 2022】

论文题目&#xff1a; 研究背景&#xff1a; 1. 三维空间结构及相关信息可以通过深度图像&#xff08;depth images&#xff09;、网格&#xff08;meshes&#xff09;和体素网格&#xff08;voxel grids&#xff09;等多种方式获取、处理、存储和利用。 2. 药物设计领域通常需…

安装KVM并创建虚拟机及基本使用

#环境说明&#xff1a;Centos7 环境准备&#xff1a; CPU开启虚拟化&#xff0c;给宿主机的CPU和内存分配足够多的配置 安装KVM 1.安装相关软件包 yum -y install qemu-kvm libvirt virt-manager virt-install virt-viewer 软件包简介&#xff1a; qemu-kvm: 为kvm提供…

vue2图片预览插件

学习&#xff1a;vue插件开发实例-图片预览插件 准备工作 准备图片与基础的样式 将iconfont下载的字体图标资源放在src/assets/iconfont目录下将准备预览的图片放到src/static/images目录下 PrevImg.vue 在plugins/PrevImg目录下&#xff0c;创建PrevImg.vue。 直接引入静…

KDGX-A光缆故障断点检测仪

一、产品概述 KDGX-A光纤寻障仪是武汉凯迪正大为光纤网络领域施工、测试、维护所设计的一款测试仪表。可实现对光纤链路状态和故障的快速分析&#xff0c;适用于室外维护作业&#xff0c;是现场光纤网络测试与维护中替代OTDR的经济型解决方案。 二、主要特点 1)一键式光纤链路…

【C语言】通讯录的实现(静态版)

【C语言】通讯录的实现(静态版一.前言1.前期准备a.菜单实现b.联系人结构体的构建c.菜单选项的功能d.#define 的定义2.功能的实现a.初始化通讯录b.增加联系人c.显示通讯录d.查找联系人e.修改联系人d.删除联系人3. 总代码test.ccontact.ccontact.h一.前言 本文将会用c语言实现一…

C++演讲比赛流程管理系统_黑马

任务 学校演讲比赛&#xff0c;12人&#xff0c;两轮&#xff0c;第一轮淘汰赛&#xff0c;第二轮决赛 选手编号 [ 10001 - 10012 ] 分组比赛 每组6人 10个评委 去除最高分 最低分&#xff0c;求平均分 为该轮成绩 每组淘汰后三名&#xff0c;前三名晋级决赛 决赛 前三名胜出 …

这些IT行业趋势,将改变2023

上一周&#xff0c;你被"AI"刷屏了吗&#xff1f; 打开任何一家科技媒体&#xff0c;人工智能都是不变的热门话题。周初大家还在用ChatGPT写论文、查资料、写代码&#xff0c;到周末的时候大家已经开始用GPT-4图像识别来做饭、Microsoft 365 Copilot 来写PPT了。 GP…

使用Android架构模板

使用Android架构模板 项目介绍 为了方便开发者引入最新的Android架构组建进行开发&#xff0c;Google官方给我们引入了一个架构模板&#xff0c;方便我们快速进入开发。 github地址&#xff1a; https://github.com/android/architecture-templates 该模板遵循官方架构指南 …

PlotNeuralNet + ChatGPT创建专业的神经网络的可视化图形

PlotNeuralNet&#xff1a;可以创建任何神经网络的可视化图表&#xff0c;并且这个LaTeX包有Python接口&#xff0c;我们可以方便的调用。 但是他的最大问题是需要我们手动的编写网络的结构&#xff0c;这是一个很麻烦的事情&#xff0c;这时 ChatGPT 就出来了&#xff0c;它可…

【云原生】k8s集群命令行工具kubectl之集群管理命令

kubectl集群管理命令详解一、准备工作1.1、Replication Controller1.2、Deployment1.3、DaemonSet1.4、查看创建的svc和pod1.5、kubectl 命令自动补全设置二、集群管理命令2.1、top2.2、cordon2.3、uncordon2.4、drain2.5、taint2.5.1、污点设置。2.5.2、容忍度使用一、准备工作…

2023年顶级编程语言趋势

对于开发人员和软件工程师来说&#xff0c;选择更优秀的编程语言使编写可以在任何地方运行的软件变得更加容易&#xff0c;工作效率更高。从 Java 的缓慢衰落到 MATLAB 的惊人流行&#xff0c;对当今最流行的编程语言的分析&#xff0c;可以帮助你了解最新趋势并响应最新趋势。…

鸟哥的Linux私房菜 正则表示法与文件格式化处理

第十一章、正则表示法与文件格式化处理 https://linux.vbird.org/linux_basic/centos7/0330regularex.php 简体版 http://cn.linux.vbird.org/linux_basic/0330regularex.php 11.2.2 grep的一些高级选项 例题一、搜索特定字符串 例题二、利用中括号 [] 来搜寻集合字符 例题四…

C语言—程序环境和预处理(1)

1.程序的翻译环境和执行环境在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境第一种为翻译环境&#xff0c;在这个环境中源代码转化为可执行的机器指令第二种是执行环境&#xff0c;它用于实际执行代码2.详解编译链接2.1翻译环境组成一个程序的每个源文件通过编译过程转…

IOS - 某驾宝典篇

首先挂上代理抓个登陆包&#xff0c;结果发现抓不到包&#xff0c;我们直接换个思路&#xff0c;采用vpn转发方式进行抓包&#xff1b; sign, hsign&#xff0c;hext-union 三个参数加密&#xff1b; hsign长度为32&#xff0c;可能为MD5 &#xff0c; 其他两个未确定&#xf…

举一反三学python(3)---海龟绘图

一、红色五角星import turtle as t t.color(red, red) # 设置轮廓线和填充色 t.begin_fill() # 开始填充 for i in range(5):t.fd(100) # 向前t.rt(144) # 右转&#xff0c;角度为180-180/5144 t.end_fill() # 填充结束 t.done() …

【基础知识】视频监控的基础知识

大家好&#xff0c;我是雷工&#xff01; 最近两天现场调试动态管控设备&#xff0c;上图为水污染源监测系统组成及控制流程图&#xff0c;可见其中涉及视频监控&#xff0c;摄像头的抓拍等环节&#xff0c;这篇一起了解下视频监控的基础知识。 一、网络监控常用设备 网络摄…

能把爬虫讲的这么透彻的,没有20年功夫还真不行【0基础也能看懂】

前言 可以说很多人学编程&#xff0c;不玩点爬虫确实少了很多意思&#xff0c;不管是业余、接私活还是职业爬虫&#xff0c;爬虫世界确实挺精彩的。 今天来给大家浅谈一下爬虫&#xff0c;目的是让准备学爬虫或者刚开始起步的小伙伴们&#xff0c;对爬虫有一个更深更全的认知…
最新文章