fix: telnet调整窗口大小
This commit is contained in:
@@ -50,11 +50,11 @@ func (c *ConnTelnet) NewClient() (*ConnTelnet, error) {
|
|||||||
// fmt.Fprintln(client, c.User)
|
// fmt.Fprintln(client, c.User)
|
||||||
// fmt.Fprintln(client, c.Password)
|
// 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
|
c.Client = &client
|
||||||
|
|
||||||
|
// 调整窗口大小 (120 列 x 128 行)
|
||||||
|
requestPty(c.Client, 120, 128)
|
||||||
|
|
||||||
// 排空连接登录的信息
|
// 排空连接登录的信息
|
||||||
c.RunCMD("")
|
c.RunCMD("")
|
||||||
return c, nil
|
return c, nil
|
||||||
@@ -107,15 +107,24 @@ func (c *ConnTelnet) RunCMD(cmd string) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewClient 创建Telnet客户端会话对象
|
// NewClient 创建Telnet客户端会话对象
|
||||||
func (c *ConnTelnet) NewClientSession(cols, rows uint8) (*TelnetClientSession, error) {
|
func (c *ConnTelnet) NewClientSession(cols, rows int) (*TelnetClientSession, error) {
|
||||||
if c.Client == nil {
|
if c.Client == nil {
|
||||||
return nil, fmt.Errorf("telnet client not connected")
|
return nil, fmt.Errorf("telnet client not connected")
|
||||||
}
|
}
|
||||||
conn := *c.Client
|
requestPty(c.Client, cols, rows)
|
||||||
// 调整窗口
|
|
||||||
conn.Write([]byte{255, 251, 31})
|
|
||||||
conn.Write([]byte{255, 250, 31, 0, cols, 0, rows, 255, 240})
|
|
||||||
return &TelnetClientSession{
|
return &TelnetClientSession{
|
||||||
Client: conn,
|
Client: *c.Client,
|
||||||
}, nil
|
}, 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
|
||||||
|
}
|
||||||
|
|||||||
@@ -257,18 +257,18 @@ func (s *WSController) Telnet(c *gin.Context) {
|
|||||||
defer client.Close()
|
defer client.Close()
|
||||||
|
|
||||||
// 终端单行字符数
|
// 终端单行字符数
|
||||||
cols, err := strconv.Atoi(c.Query("cols"))
|
cols, err := strconv.Atoi(c.DefaultQuery("cols", "120"))
|
||||||
if err != nil || cols > 254 {
|
if err != nil {
|
||||||
cols = 120
|
cols = 120
|
||||||
}
|
}
|
||||||
// 终端显示行数
|
// 终端显示行数
|
||||||
rows, err := strconv.Atoi(c.Query("rows"))
|
rows, err := strconv.Atoi(c.DefaultQuery("rows", "128"))
|
||||||
if err != nil || cols > rows {
|
if err != nil {
|
||||||
rows = 128
|
rows = 128
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建Telnet客户端会话
|
// 创建Telnet客户端会话
|
||||||
clientSession, err := client.NewClientSession(uint8(cols), uint8(rows))
|
clientSession, err := client.NewClientSession(cols, rows)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// 连接主机失败,请检查连接参数后重试
|
// 连接主机失败,请检查连接参数后重试
|
||||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo")))
|
c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo")))
|
||||||
|
|||||||
Reference in New Issue
Block a user