自动化测试
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

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
*/