Maison  >  Article  >  développement back-end  >  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
DDDoriginal
2024-11-04 09:01:02206parcourir

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>

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:
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