36 lines
812 B
Go
36 lines
812 B
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"os/exec"
|
|
"time"
|
|
)
|
|
|
|
// localExecSSHCommand 执行本地命令并返回命令输出和错误信息
|
|
func localExecSSHCommand(command string, timeout time.Duration) (string, error) {
|
|
// 使用上下文设置超时时间
|
|
ctx, cancel := context.WithTimeout(context.Background(), timeout)
|
|
defer cancel()
|
|
|
|
// 创建命令实例
|
|
cmd := exec.CommandContext(ctx, "sh", "-c", command)
|
|
|
|
// 捕获命令输出
|
|
var stdout, stderr bytes.Buffer
|
|
cmd.Stdout = &stdout
|
|
cmd.Stderr = &stderr
|
|
|
|
// 执行命令
|
|
err := cmd.Run()
|
|
if ctx.Err() == context.DeadlineExceeded {
|
|
return "", fmt.Errorf("command timeout exceeded: %v", command)
|
|
}
|
|
if err != nil {
|
|
return "", fmt.Errorf("command failed: %v, stderr: %s", err, stderr.String())
|
|
}
|
|
|
|
return stdout.String(), nil
|
|
}
|