go语言实现ssh打隧道
如何打隧道
使用ssh打个隧道,是我一直想做的事情。出发点是:在公司内部经常有些机器访问不到,只能通过公司提供的开发机,但是开发机我们可以在内网访问到,这个
基础知识
SSH是一种网络协议,用于计算机之间的加密登录,流程大致是:
- 远程主机收到用户的登录请求,把自己的公钥发给用户。
- 用户使用这个公钥,将登录密码加密后,发送回来。
- 远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
上面这个过程中很容易受到攻击的就是第一步,我们怎么知道收到的公钥是真正的主机的,体现在实际登陆中,就是会出现:
 $ ssh user@host  The authenticity of host 'host (12.18.429.21)' can't be established.  RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.  Are you sure you want to continue connecting (yes/no)?
复制代码
此处RSA key fingerprint
就是对128公钥的MD5签名,当输入yes后,就会保存到$HOME/.ssh/known_hosts,说明是对公钥的认可。
解决了信任问题后,下一个不好的是每次都需要输入密码,于是就有了公钥登陆,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
所以总结起来 ssh 认证的方式有两种:
- 用户名 + 证书
- 用户名 + 密码
下面我们来看go中相应的操作方法
golang 实现 ssh client
go get -u golang.org/x/crypto/...
复制代码
先来说2种认证方式,显示密码,通过ssh.Password
来传入密码
sshConfig := &ssh.ClientConfig{User: "your_user_name",Auth: []ssh.AuthMethod{ssh.Password("your_password")},
}
复制代码
第二种是证书的方式,这又细分为两种,一种是我们直接读取自己的私钥,另一种是从ssh-agent读取,ssh-agent是用来帮助我们管理私钥的程序,它的出现主要是为了解决当我们访问不同的主机使用不同的私钥-公钥对,同时解决如果设置了私钥的密码,需要每次都手动设置的问题。 ps:ssh-agent的管理
eval `ssh-agent` 启动agent代理
ssh-add /path/to/key/key_name 添加指定私钥
ssh-agent -k 关闭 agent
ssh-add -l 查看代理中私钥
ssh-add -L 查看代理中私钥对应的公钥
ssh-add -d /path/to/key/key_name 移除指定私钥
ssh-add -D 删除管理的所有私钥
复制代码
从文件读取
func PublicKeyFile(file string) ssh.AuthMethod {buffer, err := ioutil.ReadFile(file)if err != nil {return nil}key, err := ssh.ParsePrivateKey(buffer)if err != nil {return nil}return ssh.PublicKeys(key)
}
复制代码
从 ssh-agent 读取
func SSHAgent() ssh.AuthMethod {if sshAgent, err := net.Dial("unix", os.Getenv("SSH_AUTH_SOCK")); err == nil {return ssh.PublicKeysCallback(agent.NewClient(sshAgent).Signers)}return nil
}
复制代码
client生成
当我们有了认证方式后,下面就是生成ssh-client
sshClient, err := ssh.Dial("tcp", "host:port", sshConfig)
if err != nil {return nil, fmt.Errorf("Failed to dial: %s", err)
}
复制代码
建立连接后,我们要创建一个命令执行的session,一个session就是一次命令执行,在开始执行命令之前,我们还要建立一个伪终端,方便输入输出
modes := ssh.TerminalModes{ssh.ECHO: 0, // disable echoingssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaudssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
}if err := session.RequestPty("xterm", 80, 40, modes); err != nil {session.Close()return nil, fmt.Errorf("request for pseudo terminal failed: %s", err)
}
复制代码
再然后我们就可以开始执行代码,完整代码见ssh_client
参考
how-to-create-an-ssh-tunnel-in-go
golang中ssh基础操作
基础知识
go语言实现ssh打隧道相关推荐
- ssh远程工具_Rsync如何利用SSH加密隧道同步文件
请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 本文主要讲解Linux系统中的Rsync如何利用SSH ...
- 使用SSH反向隧道进行内网穿透
这篇文章主要介绍了如何利用SSH 反向隧道穿透NAT,并演示了如何维持一条稳定的SSH 隧道. 假设有机器A 和B,A 有公网IP,B 位于NAT 之后并无可用的端口转发,现在想由A 主动向B 发起S ...
- SSH Tunnel隧道详解
SSH Tunnel隧道详解 ssh tunnel分为三种 本地 -L 远程 -R 动态 -D 参考:https://blog.csdn.net/chenjh213/article/details/4 ...
- C语言编写SSH终端
C语言连接SSH协议通常都会用到SSHLIB2库 下面是本人封装的例子 需要的朋友可以做参考 头文件 #ifndef __INC_WINSSH #define __INC_WINSSH//====== ...
- SSH Tunnel隧道
ssh(secure shell)是一种对数据进行加密安全传输的协议.利用ssh工具可以非常方便的登录远程提供有ssh服务的主机,也可以很方便的进行文件传输.利用 ssh tunnel 可以进行端口转 ...
- SSH tunnel 隧道技术
常用的隧道技术有三种: 本地(L), 远程(R)和动态端口转发(D) 本文的例子是: 客户服务器A内网,部署了Apollo 并且有可视化界面 客户服务器B:一台跳板机 可以连通服务器A 并且带有公网I ...
- Go语言实现 ssh scp
你必须非常努力,才能看起来毫不费力! 微信搜索公众号[ 漫漫Coding路 ],一起From Zero To Hero ! 前言 最近遇到一个临时需求,需要将客户环境中一个服务每天的日志进行一系列复杂 ...
- linux ssh 隧道 tunnel 一般场景用法
SSH Tunnel 顾名思义就是 SSH 安全隧道,平时看别人的相关帖子的时候很多时候可能看不太明白讲的是几个意思,这里我们约定一下说法的含义: " HostA 可以访问 HostB &q ...
- linux 下ssh端口反弹,利用ssh隧道反弹shell
说明 本文旨在分析rssh的源代码来学习利用ssh隧道来反弹shell.整个rssh只有1个347行的main文件,所以整体的逻辑结构也比较好分析.关于SSH端口转发的知识可以看实战SSH端口转发这篇 ...
最新文章
- 操作系统:多处理器编程-- 蒋炎岩老师
- Python3中的bytes和str类型
- 幻想三国android官方版,幻想三国ol官方版
- 计算机网络(谢希仁版)知识点汇总
- 思岚激光雷达+cartographer建图
- 工程点点app爬虫和sign算法破解
- lintcode(507)摆动排序 II
- 剑指offer(41-50题)详解
- 云服务器ecs什么意思
- Pixelization论文与应用简介:像素艺术像素化算法
- har2case接口脚本必备工具
- Lab3 Report
- 飞塔防火墙命令行终端修改输出长度
- 解锁编程新姿势——键盘技巧篇
- Spring官方文档中文翻译
- java 第一章 > java背景,数据类型,键盘录入,标识符
- 傻瓜式Android APP开发入门教程
- vscode+latex(基于texLive发行版_windows)/在线高清可视化latex公式编辑器
- 中兴 -ZTE AXON 11 SE 5g 获取root 9000N 刷机 ZTE P683S10 刷机包下载
- 电力载波通信模块JST-HPLC-S-FB在物联网通信领域的应用