美文网首页golangpython高级
golang SSH客户端三件套 - 1远程连接 shell

golang SSH客户端三件套 - 1远程连接 shell

作者: 写个代码容易么 | 来源:发表于2020-06-15 10:58 被阅读0次

golang SSH客户端系列文章目录

  1. 远程登录
  2. 端口映射
  3. 文件传输

SSH(Secure Shell)协议在远程登录时比较常用,但是除此之外还有一些其它的功能也很好用,比如端口映射,X11转发,sftp文件传输等。

以下三篇文章将介绍golang版SSH的远程登录功能,端口映射功能及sftp文件传输功能。X11包含GUI的一些操作,没有找到相关的包,故不做介绍

通过golang自带的ssh包 golang.org/x/crypto/ssh 可以实现远程登录功能,默认是不支持tab键和上下箭头的
通过导入golang.org/x/crypto/ssh/terminal来创建VT100终端可以支持tab等功能,让golang版本的ssh客户端体验和平时用的其它客户端差不多。

package main

import (
    "golang.org/x/crypto/ssh"
    "golang.org/x/crypto/ssh/terminal"
    "log"
    "os"
    "time"
)

/**
golang版本的SSH客户端
SSH协议RFC文档
https://tools.ietf.org/html/rfc4254

一个ssh连接可以打开多个会话session
linux tty和pty区别
开机后登录系统的终端称为tty
远程登录的终端称为pty
pts是pty的实现方式
w命令可以显示当前系统登录的终端列表
针对交互式会话的操作
1.请求伪终端 pty-req
2.X11转发 x11-req
3.X11通道 x11
4.环境变量 env
5.启动shell或命令 shell/exec/subsystem

默认不支持上下键和tab键,还不支持clear清屏指令
通过VT100终端支持tab和clear指令
VT100终端包括一些控制符,可以在终端中显示不同颜色,支持光标控制,清屏指令等
http://www.termsys.demon.co.uk/vtansi.htm
*/
func main() {
    sshConfig := &ssh.ClientConfig{
        User: "user",
        Auth: []ssh.AuthMethod{
            ssh.Password("123456"),
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
        ClientVersion:   "",
        Timeout:         10 * time.Second,
    }
    //建立与SSH服务器的连接
    sshClient, err := ssh.Dial("tcp", "192.168.1.8:22", sshConfig)
    if err != nil {
        log.Fatalln(err.Error())
    }
    defer sshClient.Close()
    log.Println("sessionId: ", sshClient.SessionID())
    log.Println("user: ", sshClient.User())
    log.Println("ssh server version: ", string(sshClient.ServerVersion()))
    log.Println("ssh client version: ", string(sshClient.ClientVersion()))

    //打开交互式会话(A session is a remote execution of a program.)
    //https://tools.ietf.org/html/rfc4254#page-10
    session, err := sshClient.NewSession()
    if err != nil {
        log.Fatalln("Failed to create ssh session", err)
    }

    defer session.Close()

    modes := ssh.TerminalModes{
        ssh.ECHO:          1,     //打开回显
        ssh.TTY_OP_ISPEED: 14400, //输入速率 14.4kbaud
        ssh.TTY_OP_OSPEED: 14400, //输出速率 14.4kbaud
        ssh.VSTATUS:       1,
    }

    //使用VT100终端来实现tab键提示,上下键查看历史命令,clear键清屏等操作
    //VT100 start
    //windows下不支持VT100
    fd := int(os.Stdin.Fd())
    oldState, err := terminal.MakeRaw(fd)
    if err != nil {
        log.Fatalln(err.Error())
    }
    defer terminal.Restore(fd, oldState)
    //VT100 end

    termWidth, termHeight, err := terminal.GetSize(fd)

    session.Stdin = os.Stdin
    session.Stdout = os.Stdout
    session.Stderr = os.Stderr

    //打开伪终端
    //https://tools.ietf.org/html/rfc4254#page-11
    err = session.RequestPty("xterm", termHeight, termWidth, modes)
    if err != nil {
        log.Fatalln(err.Error())
    }

    //启动一个远程shell
    //https://tools.ietf.org/html/rfc4254#page-13
    err = session.Shell()
    if err != nil {
        log.Fatalln(err.Error())
    }

    //等待远程命令结束或远程shell退出
    err = session.Wait()
    if err != nil {
        log.Fatalln(err.Error())
    }
}

相关文章

网友评论

    本文标题:golang SSH客户端三件套 - 1远程连接 shell

    本文链接:https://www.haomeiwen.com/subject/excqxktx.html