>  기사  >  백엔드 개발  >  Golang을 사용하여 간단한 SSH 포트 전달을 만드는 방법은 무엇입니까?

Golang을 사용하여 간단한 SSH 포트 전달을 만드는 방법은 무엇입니까?

DDD
DDD원래의
2024-11-04 09:01:02247검색

How to Create a Simple SSH Port Forward Using Golang?

Golang에서 간단한 SSH 포트 전달

문제:

Golang에서 SSH를 통해 프로그래밍 방식으로 기본 TCP 포트 전달 생성 Ruby에 익숙한 사용자입니다.

해결책:

이 문제를 해결하려면 관련된 중요한 단계를 이해하는 것이 중요합니다.

  1. 로컬 포트에서 연결을 수락하는 로컬 리스너(net.Listener).
  2. 연결 시도 시 이를 수락하고 로컬 io.Reader 및 io.Writer 개체를 획득합니다.
  3. 원격 연결 설정 서버와 원격 포트에 io.Reader 및 io.Writer 개체를 가져옵니다.
  4. 로컬 및 원격 io.Readers와 io.Writers 간에 양방향으로 지속적으로 바이트를 전송합니다.

코드:

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

위 내용은 Golang을 사용하여 간단한 SSH 포트 전달을 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.