go shell执行优化版+ 输出结果为table格式

时间:2020-08-25 15:55:00   收藏:0   阅读:59
go shell执行优化版+ 输出结果为table格式
package main

import (
    "fmt"
    "github.com/modood/table"
    "golang.org/x/crypto/ssh"
    "io/ioutil"
    "net"
    "time"
)

func connect(user, password, host, key string, port int, cipherList []string) (*ssh.Session, error) {
    var (
        auth         []ssh.AuthMethod
        addr         string
        clientConfig *ssh.ClientConfig
        client       *ssh.Client
        config       ssh.Config
        session      *ssh.Session
        err          error
    )
    auth = make([]ssh.AuthMethod, 0)
    if key == "" {
        auth = append(auth, ssh.Password(password))
    } else {
        pemBytes, err := ioutil.ReadFile(key)
        if err != nil {
            return nil, err
        }

        var signer ssh.Signer
        if password == "" {
            signer, err = ssh.ParsePrivateKey(pemBytes)
        } else {
            signer, err = ssh.ParsePrivateKeyWithPassphrase(pemBytes, []byte(password))
        }
        if err != nil {
            return nil, err
        }
        auth = append(auth, ssh.PublicKeys(signer))
    }

    if len(cipherList) == 0 {
        config = ssh.Config{
            Ciphers: []string{"aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm@openssh.com", "arcfour256", "arcfour128", "aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc"},
        }
    } else {
        config = ssh.Config{
            Ciphers: cipherList,
        }
    }

    clientConfig = &ssh.ClientConfig{
        User:    user,
        Auth:    auth,
        Timeout: 30 * time.Second,
        Config:  config,
        HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
            return nil
        },
    }

    // connet to ssh
    addr = fmt.Sprintf("%s:%d", host, port)

    if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
        return nil, err
    }
    // create session
    if session, err = client.NewSession(); err != nil {
        return nil, err
    }
    return session, nil
}

func main() {
    var ciphers []string
    session, err := connect("root", "123456", "192.168.100.50", "", 22, ciphers)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer session.Close()
    buf, err := session.CombinedOutput("hostname")
    if err != nil {
        fmt.Println(err)
        return
    }
    re := string(buf)
    type House struct {
        Host string
        Shell string
        Return string
    }

    s := []House{
        {"192.168.100.50", "hostname", re},
    }

    t := table.Table(s)
    fmt.Println(t)
    return
}
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!