go 语言Http服务器远程执行shell命令

news2024/9/28 3:18:53

背景
想要在服务器上起一个http服务器,用来远程执行shell命令并且返回。

基础版

package main

import (
	"io"
	"log"
	"net/http"
)

func main() {
	// Hello world, the web server

	helloHandler := func(w http.ResponseWriter, req *http.Request) {
		io.WriteString(w, "Hello, world!\n")
	}

	http.HandleFunc("/hello", helloHandler)
	log.Fatal(http.ListenAndServe(":8080", nil))
}

编译完成之后,执行起一个http服务器,可以在浏览器中使用localhost:8080/hello发送请求。也可以在shell命令行中使用curl命令发送请求。
在这里插入图片描述
在这里插入图片描述
想要远程执行命令,肯定是希望用curl的方式远程执行命令。

上面已经简单的实现了一个http服务器,可以正常响应请求,我们希望的是执行shell命令,应该如何给http服务器传shell命令参数,一起看一下。

实战版

package main

import (
	"bytes"
	"fmt"
	"net/http"
	"os/exec"
)

func execShellCmdBlock(shellCmd string) (string, error) {
	var out bytes.Buffer

	cmd := exec.Command("/bin/bash", "-c", shellCmd)
	cmd.Stdout = &out

	err := cmd.Run()

	return out.String(), err
}

func Register(requestPath string) {
	http.HandleFunc(requestPath, func(writer http.ResponseWriter, request *http.Request) {
		err := request.ParseForm()
		if err != nil {
			return
		}

		cmds := request.Form["cmd"]
		if len(cmds) != 1 {
			return
		}

		ret, err := execShellCmdBlock(cmds[0])
		if err != nil {
			panic(err)
		}

		fmt.Fprintf(writer, "%s", ret)
	})
}

func main() {
	Register("/execute")

	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		panic(err)
	}
}

大概逻辑就是先注册回调,回调解析传入的参数,并且以阻塞的方式运行shell命令。

curtis@curtis-Aspire-E5-471G:~$ curl "http://192.168.0.105:8080/execute?cmd=%20ls%20-l"
total 6244
-rw-rw-r-- 1 curtis curtis      28 1217 12:53 go.mod
-rwxrwxr-x 1 curtis curtis 6383925 1217 13:34 http_server
-rw-rw-r-- 1 curtis curtis     749 1217 13:34 main.go

踩过的坑记录以下:
1、假设要在192.168.0.106上通过curl下发命令,如果http服务器所在的主机没有关闭防火墙的话,会报no route错误。
2、有些服务器可能对某些特定端口有限制,需要使用iptables服务器端口放开,如果端口未放开,会报timeout

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能脚本:用案例和图示帮你理解HTTP协议

当前使用得最为广泛的应用层协议就是 HTTP 了。我想了好久,还是觉得应该把 HTTP 协议写一下。 因为做性能测试分析的人来说,HTTP 协议可能是绕不过去的一个槛。在讲 HTTP 之前,我们得先知道一些基本的信息。 HTTP(HyperText Transfer Protocol,超文本传输协议),显然是…

linux shell编程

linux shell编程1.shell脚本概述2.脚本的调用形式3.shell脚本语法3.1 脚本开头标识3.2 脚本注释3.3 给脚本加上可执行权限3.4 shell脚本的运行方式3.5 检测脚本是否正确3.6 重定向的使用3.7 获取上一条命令的执行结果4.变量4.1 变量的定义和使用4.2 从键盘上读取变量&#xff1…

(十七)Vue之自定义指令

文章目录自定义指令局部指令回调函数形式配置对象形式全局配置回调函数形式配置对象形式Vue学习目录 上一篇:(十六)Vue之内置指令 先看两个需求: 需求1:定义一个v-big指令,和v-text功能类似,…

陈表达学VBA-msgbox辨别用户选择和代码调用

今天有个老客户提出需求: 模块:sub 过程A( ) ①如果是单独使用时则显示msgbox选择消息框 ②如果A过程调用B过程,则不显示消息框,默认选择是 msgbox没有设置默认值这个功能,msgbox也没有参数可以失败是用户点击还是代…

pytorch基础操作(六)利用L2范数(权重衰减)解决线性模型过拟合问题

一、一些概念 训练误差(training error) 是指,模型在训练数据集上计算得到的误差。 泛化误差(generalization error) 是指,模型应⽤在同样从原始样本的分布中抽取的⽆限多数据样本时,模型误差的…

【Linux】Linux基本指令

Linux基本指令1.ls指令2.pwd指令3.cd指令3.touch 指令4.mkdir指令5. rmdir指令 && rm 指令5.1 rmdir5.2 rm6.tree 指令7.man指令8.cp指令9.mv指令10. cat指令11.echo指令12.more指令13.less指令14.wc指令15.head指令16.tail指令17. | (管道指令)…

每天五分钟机器学习:PCA算法如何确定数据压缩降维的最佳维度?

本文重点 上节课程中我们已经学习了pca算法,已经知道了如何将n维特征变量降到k维,k是PCA算法的一个参数,也被称为主成分的数量。那么现在就产生了一个问题,这个问题就是如何选择K,因为PCA要做的就是要尽量减少投射的平均均方误差,所以K的选择很关键。 平均均方误差 其中…

22.MongoDB删除操作效率及相关问题验证

最近遇到一个了一个MongoDB数据删除的问题,需要一次性删除上线即1.5年前~1年前的数据且之后每天清空一年过期的数据。在数据量比较大的情况下何种方式的删除效率最高是一个值得研究的问题,本文通过实际测试找出其中规律。 本文采用腾讯云mongodb集群进行…

基于java的连连看游戏设计-计算机毕业设计

项目介绍 基于java设计的连连看游戏规则是模仿网络上的最普通的连连看游戏,主要是鼠标点击两次的图片能否消去的问题。当前,前提是点击两张相同的图片,若是点击的是同一张图片或者两张不同的图片,则不予处理。在两张相同的图片所…

这份pdf成功让我拿下了蚂蚁金服、字节跳动、小米等大厂的offer

关于程序员,除了做项目来提高自身的技术之外,还有一种提升自己的专业技能就是:多!看!书! 小编整理出一篇Java进阶架构师之路的核心知识,同时也是面试时面试官必问的知识点,篇章也是…

点云可视化工具

点云可视化工具 平时查看点云文件主要是用CloudCompare,基本上也就是打开看看这个点云大概是个什么样子,很少会在CloudCompare对点云进行处理,它可以直接将点云拖进软件进行显示也还是挺方便的。但是还是有点点不是很方便的地方,…

Linux从入门到进阶学习(Ⅲ):Linux权限管控

目录 1 root用户 1.1 su 1.2 sudo 2 用户和用户组 3 查看权限控制信息 4 修改权限控制 4.1 chmod命令 4.2 chown命令 1 root用户 1.1 su root用户即超级管理员 su [-] [用户名] 切换到root用户,exit退回普通用户从 -:可选&#xff0…

社会网络分析工具—— Gephi 或 NetworkX的简单介绍和比较(源自GPTchat)

文章目录我的原始需求两个工具介绍二者比较下载和使用后续 使用教程我的原始需求 如何对不同认知课堂的教师提问行为序列进 行社会网络分析,计算不同认知层级提问行为的中间 中心度和接近中心度, 在进行社会网络分析时,您首先需要收集数据并…

ArcGIS基础:栅格转ASCII校正简单栅格坐标

【校正栅格坐标】 有一些数据量比较小的栅格数据,位置发生了偏移,可以使用【转换工具】对其位置进行校正。 先看一下原始数据: 有2个栅格数据,如下所示,两个数据本身是一个数据,只不过发生了偏移&#x…

java+ssh+mysql银行收银管理系统

项目介绍: 本系统为基于jspmysql的银行管理系统,包含业务员、管理员登录权限,功能如下: 业务员:可以银行系统,可以查看所有客户账户信息、可以新开账户、销户、修改账户信息、存款、取款、转账等功能。 …

C51——通过震动传感器模块让继电器的灯亮起来

继电器触发 模块可以通过跳线设置高电平触发或者低电平触发(默认) 首先明确继电器的工作逻辑 怎么控制“闭合”开关呢 怎么控制“断开”开关呢 NO口 是常开端 NC 常闭端 COM 公共端 通过IO口向继电器发出低电平 ,使得COM口和NO口连接&…

05. XSS漏洞利用

05. XSS漏洞利用 XSS漏洞利用(上) 获取cookie 什么是cookie? **定义:**cookie是指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密) **作用&…

jsp+ssm计算机毕业设计宠物医院信息管理系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

垃圾回收相关概念

文章目录1. System.gc()的理解2.内存溢出与内存泄漏3. Stop The World4. 并发与并行5. 安全点与安全区域的说明6. 强引用、软引用、弱引用、虚引用1. System.gc()的理解 2.内存溢出与内存泄漏 3. Stop The World 4. 并发与并行 5. 安全点与安全区域的说明 6. 强引用、软引用、弱…

jsp+ssm计算机毕业设计大学生家教服务推荐系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…