能否通过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
相关产品推荐
相关产品推荐

