package main

import (
    "fmt"
    "github.com/mitchellh/go-homedir"
    "golang.org/x/crypto/ssh"
    "io/ioutil"
    "log"
    "time"
)

func main() {
    re,err := sshL("192.168.199.1","root","rehttPassword","password","","uname -a",22)
    if err != nil{
    fmt.println(err)
    }
    fmt.println(string(re))
}

func sshL(sshHost,sshUser,sshPassword,sshType,sshKeyPath,command string,sshPort int) ([]byte,error) {

    //创建sshp登陆配置
    config := &ssh.ClientConfig{
        Timeout:         time.Second,//ssh 连接time out 时间一秒钟, 如果ssh验证错误 会在一秒内返回
        User:            sshUser,
        HostKeyCallback: ssh.InsecureIgnoreHostKey(), //这个可以, 但是不够安全
        //HostKeyCallback: hostKeyCallBackFunc(h.Host),
    }
    if sshType == "password" {
        config.Auth = []ssh.AuthMethod{ssh.Password(sshPassword)}
    } else {
        config.Auth = []ssh.AuthMethod{publicKeyAuthFunc(sshKeyPath)}
    }



    //dial 获取ssh client
    addr := fmt.Sprintf("%s:%d", sshHost, sshPort)
    sshClient, err := ssh.Dial("tcp", addr, config)
    if err != nil {
        log.Fatal("创建ssh client 失败",err)
        return nil,err
    }
    defer sshClient.Close()


    //创建ssh-session
    session, err := sshClient.NewSession()
    if err != nil {
        log.Fatal("创建ssh session 失败",err)
        return nil,err
    }
    defer session.Close()
    //执行远程命令
    combo,err := session.CombinedOutput(command)
    if err != nil {
        log.Fatal("远程执行cmd 失败",err)
        return nil,err
    }
    return combo,nil
}

func publicKeyAuthFunc(kPath string) ssh.AuthMethod {
    keyPath, err := homedir.Expand(kPath)
    if err != nil {
        log.Fatal("find key's home dir failed", err)
    }
    key, err := ioutil.ReadFile(keyPath)
    if err != nil {
        log.Fatal("ssh key file read failed", err)
    }
    // Create the Signer for this private key.
    signer, err := ssh.ParsePrivateKey(key)
    if err != nil {
        log.Fatal("ssh key signer failed", err)
    }
    return ssh.PublicKeys(signer)
}
Last modification:November 4, 2019
如果觉得我的文章对你有用,请随意赞赏