From 765044e1e5028a633705f04e0bdb2644d58f52f2 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 21 Jun 2024 16:15:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20telnet=E8=B0=83=E6=95=B4=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/utils/telnet/telnet.go | 27 ++++++++++++++++++--------- src/modules/ws/controller/ws.go | 10 +++++----- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/framework/utils/telnet/telnet.go b/src/framework/utils/telnet/telnet.go index ce2e87a9..bcafd082 100644 --- a/src/framework/utils/telnet/telnet.go +++ b/src/framework/utils/telnet/telnet.go @@ -50,11 +50,11 @@ func (c *ConnTelnet) NewClient() (*ConnTelnet, error) { // fmt.Fprintln(client, c.User) // fmt.Fprintln(client, c.Password) - // 需要确保接收方理解并正确处理发送窗口大小设置命令 - client.Write([]byte{255, 251, 31}) // 发送窗口大小选项 - client.Write([]byte{255, 250, 31, 0, 120, 0, 128, 255, 240}) // 发送窗口行和列的大小 (120 列 x 128 行) c.Client = &client + // 调整窗口大小 (120 列 x 128 行) + requestPty(c.Client, 120, 128) + // 排空连接登录的信息 c.RunCMD("") return c, nil @@ -107,15 +107,24 @@ func (c *ConnTelnet) RunCMD(cmd string) (string, error) { } // NewClient 创建Telnet客户端会话对象 -func (c *ConnTelnet) NewClientSession(cols, rows uint8) (*TelnetClientSession, error) { +func (c *ConnTelnet) NewClientSession(cols, rows int) (*TelnetClientSession, error) { if c.Client == nil { return nil, fmt.Errorf("telnet client not connected") } - conn := *c.Client - // 调整窗口 - conn.Write([]byte{255, 251, 31}) - conn.Write([]byte{255, 250, 31, 0, cols, 0, rows, 255, 240}) + requestPty(c.Client, cols, rows) return &TelnetClientSession{ - Client: conn, + Client: *c.Client, }, nil } + +// requestPty 调整终端窗口大小 +func requestPty(client *net.Conn, cols, rows int) error { + if client == nil { + return fmt.Errorf("telnet client not connected") + } + conn := *client + // 需要确保接收方理解并正确处理发送窗口大小设置命令 + conn.Write([]byte{255, 251, 31}) + conn.Write([]byte{255, 250, 31, byte(cols >> 8), byte(cols & 0xFF), byte(rows >> 8), byte(rows & 0xFF), 255, 240}) + return nil +} diff --git a/src/modules/ws/controller/ws.go b/src/modules/ws/controller/ws.go index afb4722c..8e077c03 100644 --- a/src/modules/ws/controller/ws.go +++ b/src/modules/ws/controller/ws.go @@ -257,18 +257,18 @@ func (s *WSController) Telnet(c *gin.Context) { defer client.Close() // 终端单行字符数 - cols, err := strconv.Atoi(c.Query("cols")) - if err != nil || cols > 254 { + cols, err := strconv.Atoi(c.DefaultQuery("cols", "120")) + if err != nil { cols = 120 } // 终端显示行数 - rows, err := strconv.Atoi(c.Query("rows")) - if err != nil || cols > rows { + rows, err := strconv.Atoi(c.DefaultQuery("rows", "128")) + if err != nil { rows = 128 } // 创建Telnet客户端会话 - clientSession, err := client.NewClientSession(uint8(cols), uint8(rows)) + clientSession, err := client.NewClientSession(cols, rows) if err != nil { // 连接主机失败,请检查连接参数后重试 c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo")))