71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package ssh
|
||
|
||
import (
|
||
"fmt"
|
||
gossh "golang.org/x/crypto/ssh"
|
||
"io"
|
||
"log"
|
||
"net"
|
||
"os/exec"
|
||
)
|
||
|
||
// Cli 连接信息
|
||
type Cli struct {
|
||
User string
|
||
Pwd string
|
||
Addr string
|
||
Client *gossh.Client
|
||
Session *gossh.Session
|
||
LastResult string
|
||
}
|
||
|
||
// Connect 连接对象
|
||
func (c *Cli) Connect() (*Cli, error) {
|
||
config := &gossh.ClientConfig{}
|
||
config.SetDefaults()
|
||
config.User = c.User
|
||
config.Auth = []gossh.AuthMethod{gossh.Password(c.Pwd)}
|
||
config.HostKeyCallback = func(hostname string, remote net.Addr, key gossh.PublicKey) error { return nil }
|
||
client, err := gossh.Dial("tcp", c.Addr, config)
|
||
if nil != err {
|
||
return c, err
|
||
}
|
||
c.Client = client
|
||
return c, nil
|
||
}
|
||
|
||
// Run 执行shell
|
||
func (c Cli) Run(shell string) (string, error) {
|
||
if c.Client == nil {
|
||
if _, err := c.Connect(); err != nil {
|
||
return "", err
|
||
}
|
||
}
|
||
session, err := c.Client.NewSession()
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
// 关闭会话
|
||
defer session.Close()
|
||
buf, err := session.CombinedOutput(shell)
|
||
|
||
c.LastResult = string(buf)
|
||
return c.LastResult, err
|
||
}
|
||
|
||
func ExecCommand(strCommand string) string {
|
||
cmd := exec.Command("/bin/bash", "-c", strCommand)
|
||
stdout, _ := cmd.StdoutPipe()
|
||
errReader, _ := cmd.StderrPipe()
|
||
defer stdout.Close()
|
||
if err := cmd.Start(); err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
cmdReader := io.MultiReader(stdout, errReader)
|
||
outBytes, _ := io.ReadAll(cmdReader)
|
||
if err := cmd.Wait(); err != nil {
|
||
fmt.Println("err:", err.Error())
|
||
}
|
||
return string(outBytes)
|
||
}
|