mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 07:40:56 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package utils
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"errors"
 | 
						|
	"os/exec"
 | 
						|
)
 | 
						|
 | 
						|
// 命令执行器
 | 
						|
type CommandExecutor struct {
 | 
						|
	commands []*Command
 | 
						|
}
 | 
						|
 | 
						|
// 获取新对象
 | 
						|
func NewCommandExecutor() *CommandExecutor {
 | 
						|
	return &CommandExecutor{}
 | 
						|
}
 | 
						|
 | 
						|
// 添加命令
 | 
						|
func (this *CommandExecutor) Add(command string, arg ...string) {
 | 
						|
	this.commands = append(this.commands, &Command{
 | 
						|
		Name: command,
 | 
						|
		Args: arg,
 | 
						|
	})
 | 
						|
}
 | 
						|
 | 
						|
// 执行命令
 | 
						|
func (this *CommandExecutor) Run() (output string, err error) {
 | 
						|
	if len(this.commands) == 0 {
 | 
						|
		return "", errors.New("no commands no run")
 | 
						|
	}
 | 
						|
	var lastCmd *exec.Cmd = nil
 | 
						|
	var lastData []byte = nil
 | 
						|
	for _, command := range this.commands {
 | 
						|
		cmd := exec.Command(command.Name, command.Args...)
 | 
						|
		stdout := bytes.NewBuffer([]byte{})
 | 
						|
		cmd.Stdout = stdout
 | 
						|
		if lastCmd != nil {
 | 
						|
			cmd.Stdin = bytes.NewBuffer(lastData)
 | 
						|
		}
 | 
						|
		err = cmd.Start()
 | 
						|
		if err != nil {
 | 
						|
			return "", err
 | 
						|
		}
 | 
						|
 | 
						|
		err = cmd.Wait()
 | 
						|
		if err != nil {
 | 
						|
			_, ok := err.(*exec.ExitError)
 | 
						|
			if ok {
 | 
						|
				return "", nil
 | 
						|
			}
 | 
						|
 | 
						|
			return "", err
 | 
						|
		}
 | 
						|
		lastData = stdout.Bytes()
 | 
						|
 | 
						|
		lastCmd = cmd
 | 
						|
	}
 | 
						|
 | 
						|
	return string(bytes.TrimSpace(lastData)), nil
 | 
						|
}
 |