Maison  >  Article  >  développement back-end  >  Explication détaillée du serveur de connexion Golang SSH (simulation de terminal interactif)

Explication détaillée du serveur de connexion Golang SSH (simulation de terminal interactif)

藏色散人
藏色散人avant
2021-05-24 11:53:434833parcourir

La colonne tutorielle suivante de golang vous donnera une explication détaillée de la connexion ssh de golang au serveur (simulant un terminal interactif, j'espère qu'elle sera utile aux amis dans le besoin). !

Bibliothèque utilisée : golang.org/x/crypto/ssh (le mur a un proxy https://goproxy.cn)

1. Envoyez la commande pour exécuter 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())
}

2. Envoyez la commande pour exécuter session.Output()

session.run(command) exécute la commande directement sur l'hôte et ne se soucie pas du résultat de l'exécution. session.Output renvoie la sortie Stdout après avoir exécuté la commande

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))
}

3. Simuler le terminal interactif

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())
    }
}

Désactiver l'écho :

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


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

Remarque :

Le ssh.InsecureIgnoreHostKey ici ne vérifie pas la clé de l'hôte. Si vous devez vérifier, vous devez vous référer au code source du client pour réécrire la fonction

Utilisez le langage GO pour regrouper de manière flexible la connexion SSH au serveur pour effectuer des opérations. : https://www.cnblogs.com/ findumars/p/5930584.html

github est un très bon projet web ssh : https://github.com/libragen/felix

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer