/
ssh.go
122 lines (117 loc) · 2.66 KB
/
ssh.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package sshutil
import (
"bufio"
"github.com/sealyun/cloud-kernel-rootfs/pkg/logger"
"io"
"strings"
)
//Cmd is in host exec cmd
func (ss *SSH) Cmd(host string, cmd string) []byte {
logger.Info("[ssh][%s] %s", host, cmd)
session, err := ss.Connect(host)
defer func() {
if r := recover(); r != nil {
logger.Error("[ssh][%s]Error create ssh session failed,%s", host, err)
}
}()
if err != nil {
panic(1)
}
defer session.Close()
b, err := session.CombinedOutput(cmd)
if ss.Debug {
logger.Debug("[ssh][%s]command result is: %s", host, string(b))
}
defer func() {
if r := recover(); r != nil {
logger.Error("[ssh][%s]Error exec command failed: %s", host, err)
}
}()
if err != nil {
panic(1)
}
return b
}
func (ss *SSH) CmdAndError(host string, cmd string) ([]byte, error) {
logger.Info("[ssh][%s] %s", host, cmd)
session, err := ss.Connect(host)
if err != nil {
return nil, err
}
defer session.Close()
b, err := session.CombinedOutput(cmd)
if ss.Debug {
logger.Debug("[ssh][%s]command result is: %s", host, string(b))
}
if err != nil {
return nil, err
}
return b, nil
}
func readPipe(host string, pipe io.Reader, isErr bool) {
r := bufio.NewReader(pipe)
for {
line, _, err := r.ReadLine()
if line == nil {
return
} else if err != nil {
logger.Info("[%s] %s", host, line)
logger.Error("[ssh] [%s] %s", host, err)
return
} else {
if isErr {
logger.Error("[%s] %s", host, line)
} else {
logger.Info("[%s] %s", host, line)
}
}
}
}
func (ss *SSH) CmdAsync(host string, cmd string) error {
if ss.Debug {
logger.Debug("[%s] %s", host, cmd)
}
session, err := ss.Connect(host)
if err != nil {
logger.Error("[ssh][%s]Error create ssh session failed,%s", host, err)
return err
}
defer session.Close()
stdout, err := session.StdoutPipe()
if err != nil {
logger.Error("[ssh][%s]Unable to request StdoutPipe(): %s", host, err)
return err
}
stderr, err := session.StderrPipe()
if err != nil {
logger.Error("[ssh][%s]Unable to request StderrPipe(): %s", host, err)
return err
}
if err := session.Start(cmd); err != nil {
logger.Error("[ssh][%s]Unable to execute command: %s", host, err)
return err
}
doneout := make(chan bool, 1)
doneerr := make(chan bool, 1)
go func() {
readPipe(host, stderr, true)
doneerr <- true
}()
go func() {
readPipe(host, stdout, false)
doneout <- true
}()
<-doneerr
<-doneout
return session.Wait()
}
//CmdToString is in host exec cmd and replace to spilt str
func (ss *SSH) CmdToString(host, cmd, spilt string) string {
data := ss.Cmd(host, cmd)
if data != nil {
str := string(data)
str = strings.ReplaceAll(str, "\r\n", spilt)
return str
}
return ""
}