Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah saya boleh melaksanakan pemajuan port SSH dalam Go?

Bagaimanakah saya boleh melaksanakan pemajuan port SSH dalam Go?

Barbara Streisand
Lepaskan: 2024-11-05 02:12:02
asal
817 orang telah melayarinya

How can I implement SSH port forwarding in Go?

Pemajuan Port SSH Mudah dalam Go

Dalam artikel ini, kami akan menyelidiki tentang mencipta dan menutup port TCP asas ke hadapan melalui SSH menggunakan Pergi, khusus untuk pendatang baharu Go dan bahasa yang ditaip secara statik. Kami akan menyediakan penyelesaian yang jelas dan ringkas dengan membahagikan proses kepada langkah-langkah yang boleh difahami.

Latar Belakang dan Matlamat

Kami berhasrat untuk meniru kefungsian perintah terminal seperti "ssh -L 9000:localhost:9999 nama pengguna@pelayan" secara pemrograman menggunakan Go. Perintah ini menetapkan port ke hadapan dari port tempatan 9000 ke port jauh 9999 pada pelayan yang ditentukan.

Garis Penyelesaian

Untuk mencapai ini, kami akan mencipta pendengar tempatan pada port 9000 dan sediakan sambungan klien SSH dengan pelayan jauh. Apabila port tempatan menerima permintaan, kami akan mewujudkan sambungan ke port jauh dan memajukan data ke sana ke mari.

Pecahan Kod

<code class="go">package main

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

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) {
    sshClientConn, err := ssh.Dial("tcp", serverAddrString, config)
    if err != nil {
        log.Fatalf("ssh.Dial failed: %s", err)
    }
    sshConn, err := sshClientConn.Dial("tcp", remoteAddrString)
    go func() { _, err = io.Copy(sshConn, localConn) }()
    go func() { _, err = io.Copy(localConn, sshConn) }()
}

func main() {
    config := &ssh.ClientConfig{
        User: username,
        Auth: []ssh.AuthMethod{
            ssh.Password(password),
        },
    }
    localListener, err := net.Listen("tcp", localAddrString)
    if err != nil {
        log.Fatalf("net.Listen failed: %v", err)
    }
    for {
        localConn, err := localListener.Accept()
        if err != nil {
            log.Fatalf("listen.Accept failed: %v", err)
        }
        go forward(localConn, config)
    }
}</code>
Salin selepas log masuk

Penjelasan

  • Kami mencipta pendengar setempat pada port 9000 (localAddrString).
  • Apabila sambungan dibuat ke port tempatan, kami mewujudkan sambungan klien SSH ke pelayan (sshClientConn).
  • Kami kemudian menyambung ke port jauh pada pelayan (sshConn).
  • Gorouti berasingan digunakan untuk menyalin data daripada sambungan tempatan ke sambungan SSH dan begitu juga sebaliknya .
  • Ini membolehkan data dimajukan antara port tempatan dan jauh.

Atas ialah kandungan terperinci Bagaimanakah saya boleh melaksanakan pemajuan port SSH dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan