|
- 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)
- }
|