文章目錄:
- 目標
- 包
- golang.org/x/crypto
- gopkg.in/yaml.v2
- 注意
- 本文講的是客戶端部分
文章使用到的軟件:
- Mac 12.0 Beta(macOS Monterey),處理器為:M1
- Goland 2021.1.3
- Golang 1.17beta1
目標
- 通過Go在客戶端實現ssh隧道功能並連接到服務器的mysql
Go程序
在工作目錄創建一個go應用程序,並配置SSH的信息....還是看注釋吧! 阿巴阿巴阿巴
package main
func main() {
// 設置SSH配置
config := &ssh.ClientConfig{
// 服務器用戶名
User: "",
Auth: []ssh.AuthMethod{
// 服務器密碼
ssh.Password(""),
},
Timeout: 30 * time.Second,
HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
return nil
},
}
// 設置本地監聽器,格式:地址:端口
localListener, err := net.Listen("tcp", "localhost:13306")
if err != nil {
fmt.Printf("net.Listen failed: %v\n", err)
}
for {
localConn, err := localListener.Accept()
if err != nil {
fmt.Printf("localListener.Accept failed: %v\n", err)
}
go forward(localConn, config)
}
}
// 轉發
func forward(localConn net.Conn, config *ssh.ClientConfig) {
// 設置服務器地址,格式:地址:端口
sshClientConn, err := ssh.Dial("tcp", "", config)
if err != nil {
fmt.Printf("ssh.Dial failed: %s", err)
}
// 設置遠程地址,格式:地址:端口(請在服務器通過 ifconfig 查看地址)
sshConn, err := sshClientConn.Dial("tcp", "")
// 將localConn.Reader復制到sshConn.Writer
go func() {
_, err = io.Copy(sshConn, localConn)
if err != nil {
fmt.Printf("io.Copy failed: %v", err)
}
}()
// 將sshConn.Reader復制到localConn.Writer
go func() {
_, err = io.Copy(localConn, sshConn)
if err != nil {
fmt.Printf("io.Copy failed: %v", err)
}
}()
}
快速安排
給不想寫的朋友們安排了一個擴展包 (早說嘛...)
go get -u github.com/dtapps/dtapps/go-ssh-tunnel
擴展包使用
package main
import (
"github.com/dtapps/dtapps/go-ssh-tunnel/dssh"
)
func main() {
dssh.Tunnel("root", "", ":22", ":3306", "localhost:13306")
}