You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过AWS-StartInteractiveCommand修改SSM终端大小?现有代码无效

通过AWS-StartInteractiveCommand调整SSM终端大小的可行方案

结论:可以用AWS-StartInteractiveCommand调整SSM终端大小,但你当前的代码存在变量未定义的问题

你的代码为什么不生效?

你在命令里用了$ROWS和$COLUMNS这两个环境变量,但在SSM会话启动时的初始执行环境中,这两个变量并没有被定义,所以stty命令相当于没有接收到有效参数,自然不会生效。

两种有效的解决方法

方法1:传递明确的终端尺寸

先获取本地终端的实际行数和列数,把具体数值拼入stty命令中,而不是依赖未定义的环境变量:

import (
    "fmt"
    "os"
    "syscall"
    "unsafe"
)

// 获取当前终端的行数和列数
func getTermSize() (int, int) {
    var ws syscall.Winsize
    _, _, errno := syscall.Syscall(syscall.SYS_IOCTL,
        uintptr(os.Stdin.Fd()),
        uintptr(syscall.TIOCGWINSZ),
        uintptr(unsafe.Pointer(&ws)))
    if errno != 0 {
        // 获取失败时使用默认尺寸
        return 24, 80
    }
    return int(ws.Row), int(ws.Col)
}

func (smp *SMPClient) createSessionInput(instanceId string) {
    rows, cols := getTermSize()
    // 拼接带具体数值的stty命令
    cmd := fmt.Sprintf("stty rows %d && stty cols %d;", rows, cols)
    smp.sessionInput = &ssm.StartSessionInput{
        Target:       aws.String(instanceId),
        DocumentName: aws.String("AWS-StartInteractiveCommand"),
        Parameters:   map[string][]string{"command": {cmd}},
    }
}

方法2:利用SSM内置的终端同步机制

SSM会话本身支持终端大小的动态同步,不需要手动执行stty。如果是自定义客户端,在会话建立后,当本地终端尺寸变化时,通过websocket发送resize类型的消息即可:

{"type": "resize", "rows": 40, "cols": 120}

远程的SSM Agent会自动处理终端大小调整,比手动执行stty更可靠,还支持动态调整。

额外注意事项

  • 如果目标实例是Windows系统,替换stty命令为mode con cols=%d lines=%d。
  • 确保目标实例上的SSM Agent是最新版本,旧版本可能不支持终端同步功能。

内容的提问来源于stack exchange,提问作者default001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:57:02