使用相同 ID,分别添加 net.conn,websocket.conn
webssh := NewWebSSH() ... conn, _ := net.Dial("tcp", "127.0.0.1:22") wssh.AddSSHConn("$uuid", conn) ... ws, _ := websocket.Upgrade(w, r, nil, 512, 512) wssh.AddWebsocket("$uuid", ws)
type messageType string const ( messageTypeStdin = "stdin" messageTypeStdout = "stdout" messageTypeStderr = "stderr" messageTypeResize = "resize" messageTypeLogin = "login" messageTypePassword = "password" messageTypePublickey = "publickey" ) type message struct { Type messageType `json:"type"` Data []byte `json:"data"` Cols int `json:"cols"` Rows int `json:"rows"` }
- 登录
{type:"login",data:"$username"} - 验证
{type:"password",data:"$password"} - 窗口大小调整
{type:"resize",cols:40,rows:80} - 标准流数据
{type:"stdin",data:"$data"}{type:"stdout",data:"$data"}{type:"stderr",data:"$data"}
客户端发送 stdin,接收 stdout,stderr
消息的 data 数据使用 base64 编码传输,JavaScript 的atob & btoa可用于 base64 编码,但对 utf8 有兼容性问题,要使用decodeURIComponent & encodeURIComponent做包裹,以下是实现
function atou(encodeString) { return decodeURIComponent(escape(atob(encodeString))); } function utoa(rawString) { return btoa(encodeURIComponent(rawString)); }