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
相关产品推荐
相关产品推荐

