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

295631788 · · 499 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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
}

有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:295631788

查看原文:go shell执行优化版+ 输出结果为table格式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

499 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传