gowebssh

package module
v0.1.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 22, 2022 License: MIT Imports: 12 Imported by: 0

README

说明

使用 github.com/gorilla/websocketgolang.org/x/crypto/ssh 实现的 webssh,支持颜色以及自动补全

参考:https://github.com/myml/webssh ,在原项目的基础上新增 publickey 登陆、zmodem 上传下载(支持禁用 sz 或者 rz)

服务器端文档

快速开始

...
import (
    ...

    "github.com/gorilla/websocket"
    "github.com/leffss/gowebssh"
)
...
id := r.Header.Get("Sec-WebSocket-Key")
webssh := gowebssh.NewWebSSH()
webssh.SetTerm(gowebssh.TermLinux)
webssh.SetBuffSize(8192)
webssh.SetId(id)
webssh.SetConnTimeOut(15 * time.Second)
webssh.DisableSZ()
//webssh.DisableRZ()
...
upGrader := websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
    //Subprotocols: []string{r.Header.Get("Sec-WebSocket-Protocol")},
    Subprotocols: []string{"webssh"},
    ReadBufferSize: 8192,
    WriteBufferSize: 8192,
}
ws, _ := upGrader.Upgrade(w, r, nil)
webssh.AddWebsocket(ws)

客户端文档

消息类型

type messageType string

const (
	messageTypeAddr      = "addr"
	messageTypeTerm      = "term"
	messageTypeLogin     = "login"
	messageTypePassword  = "password"
	messageTypePublickey = "publickey"
	messageTypeStdin     = "stdin"
	messageTypeStdout    = "stdout"
	messageTypeStderr    = "stderr"
	messageTypeResize    = "resize"
	messageTypeIgnore    = "ignore"
	messageTypeConsole   = "console"
)

type message struct {
	Type messageType  `json:"type"`
	Data []byte       `json:"data,omitempty"`
	Cols int          `json:"cols,omitempty"`
	Rows int          `json:"rows,omitempty"`
}

消息协议

  1. 地址 {type:"addr",data:"$addr"}
    地址格式: ip:port,例如 192.168.223.111:22
  2. 登录 {type:"login",data:"$username"}
  3. 设置 term 终端类型 {type:"term",data:"$term"} # 可不设置,默认 xterm
  4. 验证 {type:"password",data:"$password"} or {type:"publickey",data:"$publickey"}
  5. 窗口大小调整 {type:"resize",cols:40,rows:80}
  6. 忽略数据流 {type:"ignore",data:"$data"} # 客户端发送到服务端,服务器忽略,可以用于 zmodem 文件传输记录
  7. console 数据流 {type:"console",data:"$data"} # 服务端发送到客户端,客户端显示到 console 控制台的数据, 可以用于 zmodem 文件传输时的 debug 信息
  8. alert 数据流 {type:"alert",data:"$data"} # # 服务端发送到客户端的 alert 信息
  9. 标准流数据
    {type:"stdin",data:"$data"} {type:"stdout",data:"$data"} {type:"stderr",data:"$data"}
    客户端发送 stdin, 接收 stdout, stderr

Data 数据

消息的 data 数据使用 base64 编码传输,JavaScript 的atob & btoa可用于 base64 编码,但对 utf8 有兼容性问题, 要使用decodeURIComponent & encodeURIComponent做包裹, 以下是实现

function utf8_to_b64(rawString) {
  return btoa(unescape(encodeURIComponent(rawString)));
}

function b64_to_utf8(encodeString) {
  return decodeURIComponent(escape(atob(encodeString)));
}

实例

具体实例参考 example 文件夹

预览

效果 效果 效果 效果 效果 效果

Documentation

Index

Constants

View Source
const (
	TermLinux         = "linux"
	TermAnsi          = "ansi"
	TermScoAnsi       = "scoansi"
	TermXterm         = "xterm"
	TermXterm256Color = "xterm-256color"
	TermVt100         = "vt100"
	TermVt102         = "vt102"
	TermVt220         = "vt220"
	TermVt320         = "vt320"
	TermWyse50        = "wyse50"
	TermWyse60        = "wyse60"
	TermDumb          = "dumb"
)

Variables

View Source
var (
	DefaultTerm        = TermXterm
	DefaultConnTimeout = 15 * time.Second
	DefaultLogger      = log.New(ioutil.Discard, "[webssh] ", log.Ltime|log.Ldate)
	DefaultBuffSize    = uint32(8192)
)
View Source
var (
	// sz fmt.Sprintf("%+q", "rz\r**\x18B00000000000000\r\x8a\x11")
	//ZModemSZStart = []byte{13, 42, 42, 24, 66, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 13, 138, 17}
	ZModemSZStart = []byte{42, 42, 24, 66, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 13, 138, 17}
	// sz 结束 fmt.Sprintf("%+q", "\r**\x18B0800000000022d\r\x8a")
	//ZModemSZEnd = []byte{13, 42, 42, 24, 66, 48, 56, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 50, 100, 13, 138}
	ZModemSZEnd = []byte{42, 42, 24, 66, 48, 56, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 50, 100, 13, 138}
	// sz 结束后可能还会发送两个 OO,但是经过测试发现不一定每次都会发送 fmt.Sprintf("%+q", "OO")
	ZModemSZEndOO = []byte{79, 79}

	// rz fmt.Sprintf("%+q", "**\x18B0100000023be50\r\x8a\x11")
	ZModemRZStart = []byte{42, 42, 24, 66, 48, 49, 48, 48, 48, 48, 48, 48, 50, 51, 98, 101, 53, 48, 13, 138, 17}
	// rz -e fmt.Sprintf("%+q", "**\x18B0100000063f694\r\x8a\x11")
	ZModemRZEStart = []byte{42, 42, 24, 66, 48, 49, 48, 48, 48, 48, 48, 48, 54, 51, 102, 54, 57, 52, 13, 138, 17}
	// rz -S fmt.Sprintf("%+q", "**\x18B0100000223d832\r\x8a\x11")
	ZModemRZSStart = []byte{42, 42, 24, 66, 48, 49, 48, 48, 48, 48, 48, 50, 50, 51, 100, 56, 51, 50, 13, 138, 17}
	// rz -e -S fmt.Sprintf("%+q", "**\x18B010000026390f6\r\x8a\x11")
	ZModemRZESStart = []byte{42, 42, 24, 66, 48, 49, 48, 48, 48, 48, 48, 50, 54, 51, 57, 48, 102, 54, 13, 138, 17}
	// rz 结束 fmt.Sprintf("%+q", "**\x18B0800000000022d\r\x8a")
	ZModemRZEnd = []byte{42, 42, 24, 66, 48, 56, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 50, 100, 13, 138}

	// **\x18B0
	ZModemRZCtrlStart = []byte{42, 42, 24, 66, 48}
	// \r\x8a\x11
	ZModemRZCtrlEnd1 = []byte{13, 138, 17}
	// \r\x8a
	ZModemRZCtrlEnd2 = []byte{13, 138}

	// zmodem 取消 \x18\x18\x18\x18\x18\x08\x08\x08\x08\x08
	ZModemCancel = []byte{24, 24, 24, 24, 24, 8, 8, 8, 8, 8}
)

Functions

func ByteContains added in v0.0.7

func ByteContains(x, y []byte) (n []byte, contain bool)

func UrlQueryUnescape added in v0.1.7

func UrlQueryUnescape(old string) (string, error)

Types

type WebSSH

type WebSSH struct {
	DisableZModemSZ, DisableZModemRZ bool
	ZModemSZ, ZModemRZ, ZModemSZOO   bool
	// contains filtered or unexported fields
}

WebSSH 管理 Websocket 和 ssh 连接

func NewWebSSH

func NewWebSSH() *WebSSH

WebSSH 构造函数

func (*WebSSH) AddSSHConn

func (ws *WebSSH) AddSSHConn(conn net.Conn)

添加 ssh 连接

func (*WebSSH) AddWebsocket

func (ws *WebSSH) AddWebsocket(conn *websocket.Conn)

添加 websocket 连接

func (*WebSSH) DisableRZ added in v0.0.9

func (ws *WebSSH) DisableRZ()

func (*WebSSH) DisableSZ added in v0.0.9

func (ws *WebSSH) DisableSZ()

func (*WebSSH) EnableRZ added in v0.0.9

func (ws *WebSSH) EnableRZ()

func (*WebSSH) EnableSZ added in v0.0.9

func (ws *WebSSH) EnableSZ()

func (*WebSSH) SetBuffSize

func (ws *WebSSH) SetBuffSize(buffSize uint32)

设置 buff 大小

func (*WebSSH) SetConnTimeOut added in v0.0.2

func (ws *WebSSH) SetConnTimeOut(connTimeout time.Duration)

设置连接超时时间

func (*WebSSH) SetId added in v0.0.2

func (ws *WebSSH) SetId(id string)

设置连接 id

func (*WebSSH) SetLogOut

func (ws *WebSSH) SetLogOut(out io.Writer)

设置日志输出

func (*WebSSH) SetLogger

func (ws *WebSSH) SetLogger(logger *log.Logger)

func (*WebSSH) SetTerm

func (ws *WebSSH) SetTerm(term string)

设置终端 term 类型

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL