Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erstelle ich eine einfache SSH-Portweiterleitung mit Golang?

Wie erstelle ich eine einfache SSH-Portweiterleitung mit Golang?

DDD
DDDOriginal
2024-11-04 09:01:02207Durchsuche

How to Create a Simple SSH Port Forward Using Golang?

Einfache SSH-Portweiterleitung in Golang

Problem:

Programmgesteuerte Erstellung einer einfachen TCP-Portweiterleitung über SSH in Golang für Benutzer, die mit Ruby vertraut sind.

Lösung:

Um diese Herausforderung zu bewältigen, ist es wichtig, die entscheidenden Schritte zu verstehen:

  1. Etablierung eines Lokaler Listener (net.Listener), um Verbindungen am lokalen Port zu akzeptieren.
  2. Bei einem Verbindungsversuch wird dieser akzeptiert und lokale io.Reader- und io.Writer-Objekte erfasst.
  3. Eine Remote-Verbindung herstellen an den Server und den Remote-Port und ruft dessen io.Reader- und io.Writer-Objekte ab.
  4. Kontinuierliche bidirektionale Übertragung von Bytes zwischen den lokalen und Remote-io.Readern und io.Writern.

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>

Das obige ist der detaillierte Inhalt vonWie erstelle ich eine einfache SSH-Portweiterleitung mit Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn