12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package remote
- import (
- "bytes"
- "context"
- "os"
- "strings"
- "time"
- "xg_auto_deploy/internal/global"
- "xg_auto_deploy/internal/models"
- "golang.org/x/crypto/ssh"
- )
- func SingleCmd(nodeConfig *models.ServerNodeConfig, cmd string) (string, error) {
- // 作为客户端连接SSH服务器
- client, err := ssh.Dial("tcp", nodeConfig.IpPort, nodeConfig.SSHClient)
- if err != nil {
- global.Logs.Fatal("ssh服务器失败 (Failed to dial): ", err)
- os.Exit(0)
- }
- defer client.Close()
- // 创建会话
- session, err := client.NewSession()
- if err != nil {
- global.Logs.Fatal("Failed to create session: ", err)
- os.Exit(0)
- }
- defer session.Close()
- // 设置会话标准输出,运行命令
- var b bytes.Buffer
- session.Stdout = &b
- //global.Log.Info("执行命令:", cmd)
- if err := session.Run(cmd); err != nil {
- // log.Errorf("Failed to run: " + cmd)
- // log.Errorf("命令运行失败: %s", err)
- return b.String(), err
- }
- //fmt.Println(b.String())
- return b.String(), nil
- }
- func SingleCmdTime(nodeConfig *models.ServerNodeConfig, cmd string) (string, error) {
- // 替换为你的远程服务器的 IP 地址和端口
- client, err := ssh.Dial("tcp", nodeConfig.IpPort, nodeConfig.SSHClient)
- if err != nil {
- global.Logs.Fatalf("Failed to dial: %s", err)
- }
- defer client.Close()
- // 创建新会话
- session, err := client.NewSession()
- if err != nil {
- global.Logs.Fatalf("Failed to create session: %s", err)
- }
- defer session.Close()
- // 捕获标准输出和标准错误输出
- var stdoutBuilder, stderrBuilder strings.Builder
- session.Stdout = &stdoutBuilder
- session.Stderr = &stderrBuilder
- // 设置超时
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- // 创建一个通道来接收命令执行结果
- done := make(chan error, 1)
- go func() {
- // 执行远程命令
- err := session.Run(cmd) // 替换为你要执行的命令
- done <- err
- }()
- // 等待命令执行结果或者超时
- select {
- case <-ctx.Done():
- global.Logs.Println("Command timed out")
- return "执行超时", nil
- case err := <-done:
- if err != nil {
- global.Logs.Printf("Failed to run: %s", err)
- global.Logs.Printf("Stderr: %s", stderrBuilder.String())
- return "", err
- } else {
- global.Logs.Println("Command executed successfully")
- global.Logs.Printf("Stdout: %s", stdoutBuilder.String())
- return "执行完毕", nil
- }
- }
- }
|