简单的Golang HTTP服务器——允许远程执行shell命令

464 阅读1分钟

GoShellRun 🐚

这个资源库是一个简单的 Golang HTTP 服务器,旨在允许远程执行 shell 命令。

它最初被设计为通过webhooks实现自动化部署工作流程。

安全性

为了验证一个入站请求,这个服务器会检查一个特定的头,叫做token,与你在服务器配置中设置的内容相匹配。你可能还想对你选择的端口进行防火墙,只针对特定的IP地址,因为这个服务器可以对你的机器进行外壳访问。请注意!

安装和使用

go build 为你选择的操作系统编译二进制文件。然后将二进制文件发送到你的服务器:

$ GOOS=linux GOARCH=amd64 go build .
$ scp ./go-shell-run ubuntu@12.345.67.89:/home/harrison

在你选择的一个开放的端口上运行二进制文件,并把你的API密钥传给它:

$ ssh ubuntu@12.345.67.89
$ ./go-shell-run --port=3012 --token=89fnoq8yeho8h1y3o

现在你可以通过向/jobs 端点发送任意的shell命令来向服务器传递这些命令:

$ curl --location --request POST 'http://12.345.67.89:3012/jobs' \
--header 'token: 89fnoq8yeho8h1y3o' \
--header 'Content-Type: application/json' \
--data-raw '{
    "jobs": [
        "pwd",
        "ls -la",
    ]
}'

如果服务器已经在执行作业,它将返回一个503,如果没有,你将收到一个JSON响应。

作为一个服务运行

/resources 文件夹包含一个服务清单,你可以用它来把这个二进制文件变成一个由systemctl 控制的服务,这样即使在命令失败的情况下,服务器也能持续运行。

把这个文件复制到你的/etc/systemd/system 目录,然后重新启动你的系统管理器。在Ubuntu上,这一系列的命令可能看起来像这样:

$ scp ./resources/go-shell-run.service ubuntu@12.345.67.89:/home/harrison
$ ssh ubuntu@12.345.67.89
$ sudo mv /home/harrison/go-shell-run.service /etc/systemd/system
$ sudo systemctl daemon reload
$ sudo systemctl status go-shell-run.service
● go-shell-run.service - Service that runs an HTTP server meant for arbitrary shell execution remotely.
     Loaded: loaded (/etc/systemd/system/go-shell-run.service; disabled; vendor preset: enabled)
     Active: active (running) since Sun 2022-08-07 17:20:42 UTC; 10min ago
   Main PID: 57135 (go-shell-run)
      Tasks: 3 (limit: 2354)
     Memory: 852.0K
        CPU: 5ms
     CGroup: /system.slice/go-shell-run.service
             └─57135 /home/harrison/c2c-visualization/go-shell-run --port=3012 --token=s72870h!b98f0uA(

你可以像这样用journalctl 来跟踪日志:

sudo journalctl -u go-shell-run.service --follow