使用 Golang 实现 SSH 隧道功能
文章目录:
- 目标
- 包
- 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
- Gitee 网址
- Github 网址
package mainfunc 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 mainimport (
"github.com/dtapps/dtapps/go-ssh-tunnel/dssh"
)func main() {
dssh.Tunnel("root", "", ":22", ":3306", "localhost:13306")
}
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入