Maison > développement back-end > Golang > Comment créer un transfert de port SSH simple à l'aide de Golang ?

Comment créer un transfert de port SSH simple à l'aide de Golang ?

DDD
Libérer: 2024-11-04 09:01:02
original
289 Les gens l'ont consulté

How to Create a Simple SSH Port Forward Using Golang?

Redirection de port SSH simple dans Golang

Problème :

Création par programme d'une redirection de port TCP de base sur SSH dans Golang pour utilisateurs familiers avec Ruby.

Solution :

Pour relever ce défi, il est essentiel de comprendre les étapes cruciales impliquées :

  1. Établir un écouteur local (net.Listener) pour accepter les connexions sur le port local.
  2. Lors d'une tentative de connexion, l'accepter et acquérir les objets io.Reader et io.Writer locaux.
  3. Établir une connexion à distance au serveur et au port distant, obtenant ses objets io.Reader et io.Writer.
  4. Transférer en continu des octets de manière bidirectionnelle entre les io.Readers et io.Writers locaux et distants.

Code :

<code class="go">package main

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

// Configuration parameters for SSH connection
var (
    username         = "root"
    password         = "password"
    serverAddrString = "192.168.1.100:22"
    localAddrString  = "localhost:9000"
    remoteAddrString = "localhost:9999"
)

func forward(localConn net.Conn, config *ssh.ClientConfig) {
    // Establish SSH connection to remote server
    sshClientConn, err := ssh.Dial("tcp", serverAddrString, config)
    if err != nil {
        log.Fatalf("ssh.Dial failed: %s", err)
    }

    // Connect to remote port
    sshConn, err := sshClientConn.Dial("tcp", remoteAddrString)
    if err != nil {
        log.Fatalf("sshConn.Dial failed: %s", err)
    }

    // Create goroutines for bidirectional data transfer
    go func() {
        _, err = io.Copy(sshConn, localConn)
        if err != nil {
            log.Fatalf("io.Copy failed: %v", err)
        }

    }()

    go func() {
        _, err = io.Copy(localConn, sshConn)
        if err != nil {
            log.Fatalf("io.Copy failed: %v", err)
        }

    }()
}

func main() {
    // Configure SSH client
    config := &ssh.ClientConfig{
        User: username,
        Auth: []ssh.AuthMethod{
            ssh.Password(password),
        },
    }

    // Create local listener
    localListener, err := net.Listen("tcp", localAddrString)
    if err != nil {
        log.Fatalf("net.Listen failed: %v", err)
    }

    // Monitor listener for new connections
    for {
        localConn, err := localListener.Accept()
        if err != nil {
            log.Fatalf("localListener.Accept failed: %v", err)
        }

        go forward(localConn, config)
    }
}</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal