Go에서 간단한 SSH 포트 전달
이 기사에서는 다음을 사용하여 SSH를 통해 기본 TCP 포트 전달을 생성하고 닫는 방법을 살펴보겠습니다. Go, 특히 Go 및 정적으로 유형이 지정된 언어를 처음 접하는 사용자를 위한 것입니다. 프로세스를 이해하기 쉬운 단계로 나누어 명확하고 간결한 솔루션을 제공하겠습니다.
배경과 목표
우리는 터미널 명령의 기능을 다음과 같이 복제하는 것을 목표로 합니다. Go를 사용하여 프로그래밍 방식으로 "ssh -L 9000:localhost:9999 username@server"를 사용합니다. 이 명령은 지정된 서버의 로컬 포트 9000에서 원격 포트 9999로 포트 전달을 설정합니다.
솔루션 개요
이를 달성하기 위해 포트 9000의 로컬 리스너를 만들고 원격 서버와의 SSH 클라이언트 연결을 설정합니다. 로컬 포트가 요청을 받으면 원격 포트에 연결을 설정하고 데이터를 앞뒤로 전달합니다.
코드 분석
<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>
설명
위 내용은 Go에서 SSH 포트 전달을 어떻게 구현하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!