/
ssh.go
93 lines (78 loc) · 1.81 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
package pkg
import (
"fmt"
"github.com/bhmy-shm/tools/gtop/common"
"github.com/bhmy-shm/tools/gtop/common/errorx"
"golang.org/x/crypto/ssh"
"golang.org/x/crypto/ssh/terminal"
"log"
"net"
"syscall"
)
const (
SSHUser = "root"
SSHPassword = "shm19990131."
SSHIp = "49.235.156.213"
SSHPort = 22
BuildScript = "sh"
)
func DefaultSSHModels() ssh.TerminalModes {
return ssh.TerminalModes{
ssh.ECHO: 0, //ssh 命令回显开关,1开启,0关闭
ssh.TTY_OP_ISPEED: 14400,
ssh.TTY_OP_OSPEED: 14400,
}
}
func connect(user, password, host string, port int) (*ssh.Session, error) {
var (
err error
client *ssh.Client
auth []ssh.AuthMethod
)
//get auth method
auth = make([]ssh.AuthMethod, 0)
auth = append(auth, ssh.Password(password))
hostKeyCallBack := func(hostname string, remote net.Addr, key ssh.PublicKey) error {
return nil
}
clientConfig := &ssh.ClientConfig{
User: user,
Auth: auth,
HostKeyCallback: hostKeyCallBack,
}
addr := fmt.Sprintf("%s:%d", host, port)
if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
return nil, err
}
return client.NewSession()
}
func ThreeSSHConnect(user, host string) (*ssh.Session, error) {
var (
count uint8
err error
VarSSHPassword []byte
session *ssh.Session
)
ip, port := common.AddressSplitIpPort(host)
//支持从终端输入3次密码
for count < 3 {
count++
fmt.Print("password: ")
VarSSHPassword, err = terminal.ReadPassword(syscall.Stdin)
if err != nil {
log.Fatal(err)
} else {
fmt.Println("")
}
session, err = connect(user, string(VarSSHPassword), ip, port)
if err != nil {
log.Fatal(err)
} else {
break
}
}
if session == nil {
return nil, errorx.ErrCodeSSHConnectionThreeLimit
}
return session, nil
}