Ai
1 Star 1 Fork 23

go-course/go7

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
script.go 1.67 KB
一键复制 编辑 原始数据 按行查看 历史
Mr.Yu 提交于 2022-08-30 21:23 +08:00 . 更新说明
package controller
import (
"fmt"
"io"
"os/exec"
"path/filepath"
"strings"
"github.com/infraboard/mcube/logger"
"github.com/infraboard/mcube/logger/zap"
)
func NewScriptCollector(homeDir string) *ScriptCollector {
return &ScriptCollector{
homeDir: homeDir,
log: zap.L().Named("script"),
}
}
type ScriptCollector struct {
// 脚本存放的目录
homeDir string
log logger.Logger
}
func (c *ScriptCollector) Exec(module, params string, dst io.Writer) error {
// 通过module找到脚本存放位置
script, err := c.find(module)
if err != nil {
return err
}
c.log.Debugf("exec script: %s", script)
if script == "" {
return fmt.Errorf("module %s not found", module)
}
// 根据脚本的扩展名, 来决定如何执行
var cmd *exec.Cmd
ext := filepath.Ext(script)
switch ext {
case ".sh":
cmd = exec.Command("bash", script, params)
case ".py":
cmd = exec.Command("python", script, params)
default:
cmd = exec.Command(script, params)
}
// 获取命令的输出, 以流的方式
std, err := cmd.StdoutPipe()
if err != nil {
return err
}
defer std.Close()
// 执行命令, 后台执行 go cmd.Run
if err := cmd.Start(); err != nil {
return err
}
// 把stream copy出去
_, err = io.Copy(dst, std)
if err != nil {
return err
}
return nil
}
func (c *ScriptCollector) find(module string) (string, error) {
absPath, err := filepath.Abs(c.homeDir)
if err != nil {
return "", fmt.Errorf("find module %s abs path error %s", module, err)
}
// 防止用户传入的执行脚本 超出指定目录
if strings.Contains(module, "..") {
return "", fmt.Errorf("module forbiden .. in module")
}
return filepath.Join(absPath, module), nil
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/go-course/go7.git
git@gitee.com:go-course/go7.git
go-course
go7
go7
1299c6d7ded7

搜索帮助