remote.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package remote
  2. import (
  3. "bytes"
  4. "context"
  5. "os"
  6. "strings"
  7. "time"
  8. "xg_auto_deploy/internal/global"
  9. "xg_auto_deploy/internal/models"
  10. "golang.org/x/crypto/ssh"
  11. )
  12. func SingleCmd(nodeConfig *models.ServerNodeConfig, cmd string) (string, error) {
  13. // 作为客户端连接SSH服务器
  14. client, err := ssh.Dial("tcp", nodeConfig.IpPort, nodeConfig.SSHClient)
  15. if err != nil {
  16. global.Logs.Fatal("ssh服务器失败 (Failed to dial): ", err)
  17. os.Exit(0)
  18. }
  19. defer client.Close()
  20. // 创建会话
  21. session, err := client.NewSession()
  22. if err != nil {
  23. global.Logs.Fatal("Failed to create session: ", err)
  24. os.Exit(0)
  25. }
  26. defer session.Close()
  27. // 设置会话标准输出,运行命令
  28. var b bytes.Buffer
  29. session.Stdout = &b
  30. //global.Log.Info("执行命令:", cmd)
  31. if err := session.Run(cmd); err != nil {
  32. // log.Errorf("Failed to run: " + cmd)
  33. // log.Errorf("命令运行失败: %s", err)
  34. return b.String(), err
  35. }
  36. //fmt.Println(b.String())
  37. return b.String(), nil
  38. }
  39. func SingleCmdTime(nodeConfig *models.ServerNodeConfig, cmd string) (string, error) {
  40. // 替换为你的远程服务器的 IP 地址和端口
  41. client, err := ssh.Dial("tcp", nodeConfig.IpPort, nodeConfig.SSHClient)
  42. if err != nil {
  43. global.Logs.Fatalf("Failed to dial: %s", err)
  44. }
  45. defer client.Close()
  46. // 创建新会话
  47. session, err := client.NewSession()
  48. if err != nil {
  49. global.Logs.Fatalf("Failed to create session: %s", err)
  50. }
  51. defer session.Close()
  52. // 捕获标准输出和标准错误输出
  53. var stdoutBuilder, stderrBuilder strings.Builder
  54. session.Stdout = &stdoutBuilder
  55. session.Stderr = &stderrBuilder
  56. // 设置超时
  57. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  58. defer cancel()
  59. // 创建一个通道来接收命令执行结果
  60. done := make(chan error, 1)
  61. go func() {
  62. // 执行远程命令
  63. err := session.Run(cmd) // 替换为你要执行的命令
  64. done <- err
  65. }()
  66. // 等待命令执行结果或者超时
  67. select {
  68. case <-ctx.Done():
  69. global.Logs.Println("Command timed out")
  70. return "执行超时", nil
  71. case err := <-done:
  72. if err != nil {
  73. global.Logs.Printf("Failed to run: %s", err)
  74. global.Logs.Printf("Stderr: %s", stderrBuilder.String())
  75. return "", err
  76. } else {
  77. global.Logs.Println("Command executed successfully")
  78. global.Logs.Printf("Stdout: %s", stdoutBuilder.String())
  79. return "执行完毕", nil
  80. }
  81. }
  82. }