Go 连接ssh服务器

安装

go get -u -v golang.org/x/crypto/ssh

实例

package main

import (
    "bytes"
    "fmt"
    "log"
    "golang.org/x/crypto/ssh"
    "time"
)

func main() {
    config := &ssh.ClientConfig{
        User: "root",
        Auth: []ssh.AuthMethod{
            ssh.Password("123456"),
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
        Timeout:         time.Second * 3,
    }
    client, err := ssh.Dial("tcp", "192.168.3.111:22", config)
    if err != nil {
        log.Fatal(err.Error())
    }
    defer client.Close()
    session, err := client.NewSession()
    if err != nil {
        log.Fatal(err.Error())
    }

    var stdout bytes.Buffer
    var stderr bytes.Buffer

    session.Stdout = &stdout
    session.Stderr = &stderr

    err = session.Run("hostname")
    if err != nil {
        log.Fatal(err.Error())
        return
    }
    defer session.Close()
    fmt.Println(string(stdout.Bytes()))
}

密钥认证

func main() {
    privateKey, err := ioutil.ReadFile("/root/.ssh/id_rsa")
    if err != nil {
        log.Fatal(err.Error())
    }
    signer, err = ssh.ParsePrivateKey(privateKey)
    # signer, err = ssh.ParsePrivateKeyWithPassphrase(privateKey, []byte(passParse))
    if err != nil {
        log.Fatal(err.Error())
    }
    auth := []ssh.AuthMethod{
        ssh.PublicKeys(signer),
    }
    config := &ssh.ClientConfig{
        User: "root",
        Auth: auth,
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
        Timeout:         time.Second * 3,
    }
    client, err := ssh.Dial("tcp", "192.168.3.111:22", config)
    if err != nil {
        log.Fatal(err.Error())
    }
    defer client.Close()
    session, err := client.NewSession()
    if err != nil {
        log.Fatal(err.Error())
    }

    var stdout bytes.Buffer
    var stderr bytes.Buffer

    session.Stdout = &stdout
    session.Stderr = &stderr

    err = session.Run("hostname")
    if err != nil {
        log.Fatal(err.Error())
        return
    }
    defer session.Close()
    fmt.Println(string(stdout.Bytes()))
}

文件传输

func main() {
    config := &ssh.ClientConfig{
        User: "root",
        Auth: []ssh.AuthMethod{
            ssh.Password("123456"),
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
        Timeout:         time.Second * 3,
    }
    client, err := ssh.Dial("tcp", "192.168.3.111:22", config)
    if err != nil {
        log.Fatal(err.Error())
    }
    defer client.Close()

    var (
        src string = "/etc/passwd"
        dest string = "/tmp/passwd"
        buffer int = 1024
    )

    sftpClient, err := sftp.NewClient(client)

    srcFile, err := os.Open(src)
    if err != nil {
        log.Fatal(err.Error())
    }

    defer srcFile.Close()

    dstFile, err := sftpClient.Create(dest)
    if err != nil {
        log.Fatal(err.Error())
    }
    defer dstFile.Close()

    buf := make([]byte, buffer)
    for {
        block, err := srcFile.Read(buf)
        if err != nil && err != io.EOF {
            log.Fatal(err.Error())
        }
        if block == 0 || err == io.EOF {
            break
        }
        dstFile.Write(buf)
    }
}

动态刷新

func main() {
    config := &ssh.ClientConfig{
        User: "root",
        Auth: []ssh.AuthMethod{
            ssh.Password("123456"),
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
        Timeout:         time.Second * 3,
    }
    client, err := ssh.Dial("tcp", "192.168.3.111:22", config)
    if err != nil {
        log.Fatal(err.Error())
    }
    defer client.Close()
    session, err := client.NewSession()
    if err != nil {
        log.Fatal(err.Error())
    }

    session.Stdout = os.Stdout
    session.Stderr = os.Stderr
    session.Stdin = os.Stdin

    fd := int(os.Stdin.Fd())
    oldState, err := terminal.MakeRaw(fd)
    if err != nil {
        panic(err)
    }
    defer terminal.Restore(fd, oldState)
    termWidth, termHeight, err := terminal.GetSize(fd)
    if err != nil {
        panic(err)
    }
    // Set up terminal modes
    modes := ssh.TerminalModes{
        ssh.ECHO:          1,     // enable echoing
        ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
        ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
    }

    // Request pseudo terminal
    if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {
        log.Fatal(err.Error())
    }

    session.Run("top")
}

Last updated

Was this helpful?