Go SSH连接

作者: 太阳上的雨天 分类: Go 发布时间: 2022-10-12 19:34

需要用到的包 (需要科学上网)

go get golang.org/x/crypto/ssh

SSH是什么

SSH(Secure Shell) 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议,利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

SSH如何工作

SSH由服务器和客户端组成,在实现客户端与服务器建立安全通信的过程中,经历如下阶段

  1. 连接建立

SSH服务器在指定的端口侦听客户端的连接请求,在客户端向服务器发起连接请求后,双方建立一个TCP连接。

  1. 版本协商

SSH协议目前存在SSH1.X(SSH2.0之前的版本)和SSH2.0版本。SSH2.0协议相比SSH1.X协议来说,在结构上做了扩展,可以支持更多的认证方法和密钥交换方法,同时提高了服务能力。SSH服务器和客户端通过协商确定最终使用的SSH版本号。

  1. 算法协商

SSH支持多种加密算法,双方根据各自支持的算法,协商出最终用于产生会话密钥的密钥交换算法、用于数据信息加密的加密算法、用于进行数字签名和认证的公钥算法以及用于数据完整性保护的HMAC算法。

  1. 密钥交换

服务器和客户端通过密钥交换算法,动态生成共享的会话密钥和会话ID,建立加密通道。会话密钥主要用于后续数据传输的加密,会话ID用于在认证过程中标识该SSH连接。

  1. 用户认证

SSH客户端向服务器端发起认证请求,服务器端对客户端进行认证。SSH支持以下几种认证方式:

  • 密码(password)认证:客户端通过用户名和密码的方式进行认证,将加密后的用户名和密码发送给服务器,服务器解密后与本地保存的用户名和密码进行对比,并向客户端返回认证成功或失败的消息。
  • 密钥(publickey)认证:客户端通过用户名,公钥以及公钥算法等信息来与服务器进行认证。
  • password-publickey认证:指用户需要同时满足密码认证和密钥认证才能登录。
  • all认证:只要满足密码认证和密钥认证其中一种即可。
  1. 会话请求

认证通过后,SSH客户端向服务器端发送会话请求,请求服务器提供某种类型的服务,即请求与服务器建立相应的会话。

  1. 会话交互

会话建立后,SSH服务器端和客户端在该会话上进行数据信息的交互。

实现 (以密码的方式)

  1. ssh配置
    config := ssh.ClientConfig{
        User:            _const.Name,
        Auth:            []ssh.AuthMethod{ssh.Password(_const.Password)},
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }
  1. 建立tcp连接
    client, err := ssh.Dial("tcp", _const.Address+_const.Port, &config)
    if err != nil {
        log.Fatal(err)
    }
  1. 创建一个会话
    session, err := client.NewSession()
    if err != nil {
        log.Fatal(err)
    }
    defer session.Close()
  1. 发起会话请求
    err = session.RequestPty("xterm", 32, 160, modes)
    if err != nil {
        log.Fatal(err)
    }
  1. 运行

image-20221012134202854

  1. 完整代码

gossh

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注