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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:01:00