如何让aws ssm send-command返回远程执行脚本的退出码?
解决AWS SSM远程命令等待与退出码获取问题
你的问题核心是aws ssm send-command默认异步执行,不会等待远程命令完成,下面提供两种可行方案实现你的需求:
方案一:使用--wait参数(简洁版)
send-command自带--wait参数,会自动阻塞本地脚本直到远程命令执行完毕,搭配jq工具可以直接解析返回的JSON提取退出码。
# 执行远程命令并等待完成,捕获输出结果 cmd_output=$(aws ssm send-command \ --instance-id i-012345678 \ --document-name AWS-RunShellScript \ --parameters 'commands=["touch /tmp/bingo"]' \ --wait) # 从输出中提取远程命令的退出码 remote_exit_code=$(echo "$cmd_output" | jq -r '.Command.Plugins[0].ExitCode') echo "远程命令执行完成,退出码:$remote_exit_code"
关键说明
--wait:强制命令等待远程实例上的脚本执行结束,无需手动按Ctrl+C中断jq -r '.Command.Plugins[0].ExitCode':精准提取JSON结构中shell脚本插件的退出码
方案二:手动轮询命令状态(无jq依赖版)
如果环境中没有jq,可以先获取命令ID,再循环查询执行状态,直到命令完成后提取退出码。
# 执行远程命令,仅返回命令ID command_id=$(aws ssm send-command \ --instance-id i-012345678 \ --document-name AWS-RunShellScript \ --parameters 'commands=["touch /tmp/bingo"]' \ --query 'Command.CommandId' \ --output text) # 循环查询命令状态,直到执行完成 while true; do status=$(aws ssm get-command-invocation \ --command-id "$command_id" \ --instance-id i-012345678 \ --query 'Status' \ --output text) # 状态为Success、Failed或Cancelled时退出循环 if [[ "$status" != "Pending" && "$status" != "InProgress" ]]; then break fi sleep 2 # 每2秒查询一次状态 done # 获取远程命令的退出码 remote_exit_code=$(aws ssm get-command-invocation \ --command-id "$command_id" \ --instance-id i-012345678 \ --query 'Plugins[0].ExitCode' \ --output text) echo "远程命令执行完成,退出码:$remote_exit_code"
关键说明
--query 'Command.CommandId' --output text:仅提取命令ID,避免多余JSON输出干扰- 轮询逻辑:通过
get-command-invocation检查命令状态,直到状态脱离待执行/执行中阶段
内容的提问来源于stack exchange,提问作者Gavriel
相关产品推荐
相关产品推荐

