Detailed explanation of golang ssh connection server (simulating interactive terminal)

藏色散人
Release: 2021-05-24 11:53:43
forward
4847 people have browsed it

The following tutorial column will give you a detailed explanation of golang ssh connection to the server (simulating interactive terminal) in the golang tutorial column. I hope it will be helpful to friends in need!

Library used: golang.org/x/crypto/ssh (the wall has a proxy https://goproxy.cn)

1. Send the command to execute session.Run()

package main

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

func main() {
    // 建立SSH客户端连接
    client, err := ssh.Dial("tcp", "127.0.0.1:2222", &ssh.ClientConfig{
        User:            "root",
        Auth:            []ssh.AuthMethod{ssh.Password("123456")},
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    })
    if err != nil {
        log.Fatalf("SSH dial error: %s", err.Error())
    }

    // 建立新会话
    session, err := client.NewSession()
    if err != nil {
        log.Fatalf("new session error: %s", err.Error())
    }

    defer session.Close()


    var b bytes.Buffer
    session.Stdout = &b
    if err := session.Run("ls"); err != nil {
        panic("Failed to run: " + err.Error())
    }
    fmt.Println(b.String())
}
Copy after login

2. Send the command to execute session.Output()

session.run(command) executes the command directly on the host and does not care about the execution result. session.Output returns the Stdout after executing the command

package main

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

func test() {

    // 建立SSH客户端连接
    client, err := ssh.Dial("tcp", "127.0.0.1:2222", &ssh.ClientConfig{
        User:            "root",
        Auth:            []ssh.AuthMethod{ssh.Password("123456")},
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    })
    if err != nil {
        log.Fatalf("SSH dial error: %s", err.Error())
    }

    // 建立新会话
    session, err := client.NewSession()
    defer session.Close()
    if err != nil {
        log.Fatalf("new session error: %s", err.Error())
    }

    result, err := session.Output("ls -al")
    if err != nil {
        fmt.Fprintf(os.Stdout, "Failed to run command, Err:%s", err.Error())
        os.Exit(0)
    }
    fmt.Println(string(result))
}
Copy after login

3. Simulate interactive terminal

package main

import (
    "golang.org/x/crypto/ssh"
    "log"
    "os")

func main() {
    // 建立SSH客户端连接
    client, err := ssh.Dial("tcp", "127.0.0.1:2222", &ssh.ClientConfig{
        User:            "root",
        Auth:            []ssh.AuthMethod{ssh.Password("123456")},
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    })
    if err != nil {
        log.Fatalf("SSH dial error: %s", err.Error())
    }

    // 建立新会话
    session, err := client.NewSession()
    defer session.Close()
    if err != nil {
        log.Fatalf("new session error: %s", err.Error())
    }

    session.Stdout = os.Stdout // 会话输出关联到系统标准输出设备
    session.Stderr = os.Stderr // 会话错误输出关联到系统标准错误输出设备
    session.Stdin = os.Stdin   // 会话输入关联到系统标准输入设备
    modes := ssh.TerminalModes{
        ssh.ECHO:          0,  // 禁用回显(0禁用,1启动)
        ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
        ssh.TTY_OP_OSPEED: 14400, //output speed = 14.4kbaud    }
    if err = session.RequestPty("linux", 32, 160, modes); err != nil {
        log.Fatalf("request pty error: %s", err.Error())
    }
    if err = session.Shell(); err != nil {
        log.Fatalf("start shell error: %s", err.Error())
    }
    if err = session.Wait(); err != nil {
        log.Fatalf("return error: %s", err.Error())
    }
}
Copy after login

Disable echo:

//如果不禁用回显
[root@65a9c031a770 ~]# ls
ls
anaconda-ks.cfg


//禁用回显
[root@65a9c031a770 ~]# ls
anaconda-ks.cfg
Copy after login

Note:

The ssh.InsecureIgnoreHostKey here does not check the host key. If you need to check, you must refer to the client source code to rewrite the function

Use GO language to flexibly batch ssh to log in to the server to perform operations: https://www.cnblogs.com/ findumars/p/5930584.html

github is a very good web ssh project: https://github.com/libragen/felix

The above is the detailed content of Detailed explanation of golang ssh connection server (simulating interactive terminal). For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:cnblogs.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template