Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Membuat Port Forward SSH Mudah Menggunakan Golang?

Bagaimana untuk Membuat Port Forward SSH Mudah Menggunakan Golang?

DDD
DDDasal
2024-11-04 09:01:02207semak imbas

How to Create a Simple SSH Port Forward Using Golang?

Pemajuan Port SSH Mudah di Golang

Masalah:

Menghasilkan port TCP asas ke hadapan melalui SSH di Golang secara berprogram untuk pengguna biasa dengan Ruby.

Penyelesaian:

Untuk menangani cabaran ini, adalah penting untuk memahami langkah penting yang terlibat:

  1. Mewujudkan pendengar tempatan (net.Listener) untuk menerima sambungan pada port tempatan.
  2. Setelah mencuba sambungan, menerimanya dan memperoleh objek io.Reader dan io.Writer setempat.
  3. Mewujudkan sambungan jauh ke pelayan dan port jauh, mendapatkan objek io.Reader dan io.Writernya.
  4. Memindahkan bait secara berterusan secara dwiarah antara io.Readers dan io.Writers setempat dan jauh.

Kod:

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

Atas ialah kandungan terperinci Bagaimana untuk Membuat Port Forward SSH Mudah Menggunakan Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn