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