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

Shell脚本本地运行正常 作为AWS SSM命令执行报语法错误

报错根因
  • 脚本中>( tee -a $LOG_FILE )属于进程替换专属语法,仅Bash、Zsh等高级Shell支持
  • AWS SSM的aws:runShellScript动作默认使用/bin/sh解释执行脚本,/bin/sh无进程替换特性,因此触发语法错误
修复方案

方案1:指定Bash解释器(推荐)

显式声明脚本使用Bash执行,兼容原有语法,修改后的SSM文档如下:

---
schemaVersion: "2.2"
description: "List files"
mainSteps:
  - action: "aws:runShellScript"
    name: "ListInputFiles"
    precondition:
      StringEquals:
        - "platformType"
        - "Linux"
    inputs:
      runCommand:
        - "#!/bin/bash"
        - "LOG_FILE='${ssmCmdLogFile}'"
        - "exec 2> >( tee -a $LOG_FILE ) 3>&1 1>>$LOG_FILE"

如果部分SSM环境未自动识别Shebang,可直接调用Bash执行命令行:

bash -c "LOG_FILE='${ssmCmdLogFile}'; exec 2> >( tee -a $LOG_FILE ) 3>&1 1>>$LOG_FILE"

方案2:兼容sh的替代写法

如果目标实例未安装Bash,可使用传统重定向方式实现相同效果,无需进程替换:

LOG_FILE='${ssmCmdLogFile}'
# 保存原始标准输出到文件描述符3
exec 3>&1
# 标准输出、错误都写入日志文件
exec 1>>${LOG_FILE} 2>&1
# 后续需要同时输出到终端的内容,管道转发到/dev/fd/3即可
echo "测试输出" | tee /dev/fd/3
验证步骤

修改完成后先在目标实例上用/bin/sh 脚本路径手动执行,确认无语法报错后再通过SSM下发。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:45:03