You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
2.9 KiB
153 lines
2.9 KiB
package ssh
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
"automatedtesting/usecases_server/utils/cyllib/log"
|
|
|
|
// "usecases/usecases_server/utils/cyllib/serial"
|
|
|
|
"golang.org/x/crypto/ssh"
|
|
)
|
|
|
|
type SSHMsg struct {
|
|
Host string
|
|
Port string
|
|
User string
|
|
Password string
|
|
// FlagMqttSub bool //mqtt订阅标志
|
|
|
|
}
|
|
type SSHClient struct {
|
|
Msg SSHMsg `json:"msg"`
|
|
Client *ssh.Client
|
|
// Session *ssh.Session
|
|
}
|
|
|
|
func NewSshClient(msg SSHMsg) (*SSHClient, error) {
|
|
config := &ssh.ClientConfig{
|
|
Timeout: time.Second * 5,
|
|
User: msg.User,
|
|
HostKeyCallback: ssh.InsecureIgnoreHostKey(), //这个可以, 但是不够安全
|
|
}
|
|
config.Auth = []ssh.AuthMethod{ssh.Password(msg.Password)}
|
|
|
|
addr := fmt.Sprintf("%s:%s", msg.Host, msg.Port)
|
|
c, err := ssh.Dial("tcp", addr, config)
|
|
if err != nil {
|
|
fmt.Println("ssh.Dial error:", err)
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
sh := SSHClient{}
|
|
sh.Client = c
|
|
return &sh, nil
|
|
}
|
|
|
|
// func (s *SSHClient) Connect() error {
|
|
// var err error
|
|
// s.Session, err = s.Client.NewSession()
|
|
// if err != nil {
|
|
// return err
|
|
// }
|
|
// return nil
|
|
// }
|
|
|
|
func (s *SSHClient) Close() bool {
|
|
if s.Client != nil {
|
|
s.Client.Close()
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// func (s *SSHClient) CloseConnect() bool {
|
|
// if s.Session != nil {
|
|
// s.Session.Close()
|
|
// return true
|
|
// }
|
|
// return false
|
|
// }
|
|
|
|
func (s *SSHClient) Run(cmd string) (string, error) {
|
|
log.Try()
|
|
sen, err := s.Client.NewSession()
|
|
if err != nil {
|
|
// log.WriteErr(err)
|
|
return "", err
|
|
}
|
|
data, err := sen.CombinedOutput(cmd)
|
|
if err != nil {
|
|
// log.WriteErr(err)
|
|
return "", err
|
|
}
|
|
sen.Close()
|
|
return string(data), nil
|
|
}
|
|
|
|
// func (s *SSHClient) Exe(cmd string, msg SSHMsg) error {
|
|
// var err error
|
|
// Client, err := NewSshClient(msg)
|
|
// s.Client = Client.Client
|
|
// if err != nil {
|
|
// return err
|
|
// }
|
|
// s.Connect()
|
|
// err = s.Session.Start(cmd)
|
|
// defer s.Close()
|
|
// if err != nil {
|
|
// return err
|
|
// }
|
|
// return nil
|
|
// }
|
|
|
|
func SSHExeOutput(cmd string, msg SSHMsg, closeflag bool) (string, *SSHClient, error) {
|
|
sshClient := SSHClient{}
|
|
defer func() {
|
|
if closeflag {
|
|
sshClient.Close()
|
|
}
|
|
}()
|
|
var err error
|
|
sh, err := NewSshClient(msg)
|
|
if err != nil {
|
|
log.WriteErr(err)
|
|
return "", nil, err
|
|
}
|
|
client := sh.Client
|
|
sshClient.Msg = msg
|
|
sshClient.Client = client
|
|
data, err := sshClient.Run(cmd)
|
|
if err != nil {
|
|
// log.WriteErr(err)
|
|
return "", nil, err
|
|
}
|
|
return data, &sshClient, err
|
|
}
|
|
|
|
// func (s *SSHClient) RunOnce(cmd string) (string, error) {
|
|
// data, err := s.RunOnce(cmd)
|
|
// if err != nil {
|
|
// return "", err
|
|
// }
|
|
// s.CloseSSH()
|
|
// return data, nil
|
|
// }
|
|
|
|
/*
|
|
//创建ssh-session
|
|
session, err := sshClient.NewSession()
|
|
if err != nil {
|
|
fmt.Println("创建ssh session 失败", err)
|
|
}
|
|
defer session.Close()
|
|
|
|
//执行远程命令
|
|
combo, err := session.CombinedOutput("whoami; cd /; ls -al")
|
|
if err != nil {
|
|
fmt.Println("远程执行cmd 失败", err)
|
|
}
|
|
fmt.Println("命令输出:", string(combo))
|
|
return session
|
|
*/
|
|
|