优化批量执行指令和windows接入发送组合键

This commit is contained in:
dushixiang
2021-01-23 22:41:44 +08:00
parent ba982dacd0
commit 038f59d155
10 changed files with 290 additions and 91 deletions

View File

@ -2,6 +2,7 @@ package api
import (
"bytes"
"encoding/json"
"fmt"
"github.com/gorilla/websocket"
"github.com/labstack/echo/v4"
@ -46,6 +47,22 @@ func (w *NextWriter) Read() ([]byte, int, error) {
return buf, read, err
}
const (
Data = "data"
Resize = "resize"
Closed = "closed"
)
type Message struct {
Type string `json:"type"`
Content string `json:"content"`
}
type WindowSize struct {
Height int `json:"height"`
Width int `json:"width"`
}
func SSHEndpoint(c echo.Context) error {
ws, err := UpGrader.Upgrade(c.Response().Writer, c.Request(), nil)
if err != nil {
@ -60,12 +77,22 @@ func SSHEndpoint(c echo.Context) error {
sshClient, err := CreateSshClient(assetId)
if err != nil {
logrus.Errorf("创建SSH客户端失败%v", err.Error())
msg := Message{
Type: Closed,
Content: err.Error(),
}
err := WriteMessage(ws, msg)
return err
}
session, err := sshClient.NewSession()
if err != nil {
logrus.Errorf("创建SSH会话失败%v", err.Error())
msg := Message{
Type: Closed,
Content: err.Error(),
}
err := WriteMessage(ws, msg)
return err
}
defer session.Close()
@ -93,15 +120,39 @@ func SSHEndpoint(c echo.Context) error {
return err
}
go func() {
msg := Message{
Type: Data,
Content: "Connect to server successfully.",
}
_ = WriteMessage(ws, msg)
var mut sync.Mutex
var active = true
go func() {
for true {
mut.Lock()
if !active {
logrus.Debugf("会话: %v -> %v 关闭", sshClient.LocalAddr().String(), sshClient.RemoteAddr().String())
break
}
mut.Unlock()
p, n, err := b.Read()
if err != nil {
continue
}
if n > 0 {
WriteByteMessage(ws, p)
msg := Message{
Type: Data,
Content: string(p),
}
message, err := json.Marshal(msg)
if err != nil {
logrus.Warnf("生成Json失败 %v", err)
continue
}
WriteByteMessage(ws, message)
}
time.Sleep(time.Duration(100) * time.Millisecond)
}
@ -110,16 +161,53 @@ func SSHEndpoint(c echo.Context) error {
for true {
_, message, err := ws.ReadMessage()
if err != nil {
// web socket会话关闭后主动关闭ssh会话
_ = session.Close()
mut.Lock()
active = false
mut.Unlock()
break
}
var msg Message
err = json.Unmarshal(message, &msg)
if err != nil {
logrus.Warnf("解析Json失败: %v, 原始字符串:%v", err, string(message))
continue
}
_, err = stdinPipe.Write(message)
if err != nil {
logrus.Debugf("Tunnel write: %v", err)
switch msg.Type {
case Resize:
var winSize WindowSize
err = json.Unmarshal([]byte(msg.Content), &winSize)
if err != nil {
logrus.Warnf("解析SSH会话窗口大小失败: %v", err)
continue
}
if err := session.WindowChange(winSize.Height, winSize.Height); err != nil {
logrus.Warnf("更改SSH会话窗口大小失败: %v", err)
continue
}
case Data:
_, err = stdinPipe.Write([]byte(msg.Content))
if err != nil {
logrus.Debugf("SSH会话写入失败: %v", err)
}
}
}
return err
}
func WriteMessage(ws *websocket.Conn, msg Message) error {
message, err := json.Marshal(msg)
if err != nil {
logrus.Warnf("生成Json失败 %v", err)
}
WriteByteMessage(ws, message)
return err
}
func CreateSshClient(assetId string) (*ssh.Client, error) {
asset, err := model.FindAssetById(assetId)
if err != nil {
@ -195,10 +283,6 @@ func CreateSshClient(assetId string) (*ssh.Client, error) {
return sshClient, nil
}
func WriteMessage(ws *websocket.Conn, message string) {
WriteByteMessage(ws, []byte(message))
}
func WriteByteMessage(ws *websocket.Conn, p []byte) {
err := ws.WriteMessage(websocket.TextMessage, p)
if err != nil {

View File

@ -89,6 +89,7 @@ func TunEndpoint(c echo.Context) error {
configuration.SetParameter(guacd.DisableBitmapCaching, propertyMap[guacd.DisableBitmapCaching])
configuration.SetParameter(guacd.DisableOffscreenCaching, propertyMap[guacd.DisableOffscreenCaching])
configuration.SetParameter(guacd.DisableGlyphCaching, propertyMap[guacd.DisableGlyphCaching])
configuration.SetParameter("server-layout", "en-us-qwerty")
break
case "ssh":
if len(session.PrivateKey) > 0 && session.PrivateKey != "-" {