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

如何在Bash中遍历EC2实例列表并检查SSM使用情况

解决Bash遍历EC2实例并检查SSM状态的问题

问题修正说明

你之前的错误源于两点:一是数组赋值方式不符合Bash语法,二是使用--output table会输出带格式的表格文本,无法直接用于遍历。下面是可行的实现方案:

完整Bash脚本实现

#!/bin/bash

# 获取us-west-2区域运行中EC2实例的纯文本ID列表
instance_ids=$(aws ec2 describe-instances --region us-west-2 --filters "Name=instance-state-name,Values=running" --output text --query 'Reservations[*].Instances[*].InstanceId')

# 逐个遍历实例ID,检查SSM注册状态
for instance_id in $instance_ids; do
    # 查询实例是否在SSM中注册
    registered=$(aws ssm describe-instance-information --region us-west-2 --filters "Key=InstanceIds,Values=$instance_id" --query 'InstanceInformationList[0].InstanceId' --output text)
    
    if [ "$registered" = "$instance_id" ]; then
        echo "实例 $instance_id 已启用SSM"
    else
        echo "实例 $instance_id 未启用SSM"
    fi
done

关键调整点

  • 替换--output table为--output text,返回空格分隔的纯文本实例ID,便于直接遍历
  • 无需手动声明空数组,直接用$(命令)捕获命令输出并赋值给变量
  • 使用aws ssm describe-instance-information验证SSM状态:返回实例ID则代表已注册,返回None则未注册

简化版(仅输出未启用SSM的实例)

如果只需要筛选未使用SSM的实例,可简化脚本:

#!/bin/bash

aws ec2 describe-instances --region us-west-2 --filters "Name=instance-state-name,Values=running" --output text --query 'Reservations[*].Instances[*].InstanceId' | while read -r instance_id; do
    # 静默查询,无结果则输出实例ID
    if ! aws ssm describe-instance-information --region us-west-2 --filters "Key=InstanceIds,Values=$instance_id" --query 'InstanceInformationList[0]' --output text >/dev/null 2>&1; then
        echo "$instance_id"
    fi
done

内容的提问来源于stack exchange,提问作者Tyrin Jefferson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:40:44