如何通过gcloud判断项目所有者账户状态并批量筛选废弃项目
批量判断GCP项目所有者账户活跃状态的方法
你已经能批量获取GCP项目的所有者,但要判断这些账户是否活跃,需要结合gcloud identity users describe命令来实现,具体步骤和修改后的脚本如下:
核心思路
- 从
get-iam-policy返回的成员中,过滤出用户类型的成员(格式为user:xxx@yourdomain.com),排除服务账号、群组等非个人用户类型 - 提取用户邮箱,调用
gcloud identity users describe命令获取用户状态,该命令会返回用户的isSuspended字段(true表示账户已停用,false表示活跃) - 整合逻辑,批量输出每个项目对应的活跃/非活跃所有者列表
修改后的脚本
# 先获取所有项目ID PROJECTS=$(gcloud projects list --format="value(projectId)") # 缓存已查询过的用户状态,避免重复查询提升效率 declare -A USER_STATUS_CACHE for PROJECT in ${PROJECTS}; do echo "=== 处理项目: ${PROJECT} ===" # 获取项目的所有者成员,过滤出user类型的成员 OWNERS=$(gcloud projects get-iam-policy ${PROJECT} --flatten=bindings \ --filter="bindings.role:roles/owner AND bindings.members:user:*" \ --format='value(bindings.members)') for OWNER in ${OWNERS}; do # 提取用户邮箱(去掉前缀user:) USER_EMAIL=${OWNER#user:} # 先查缓存,没有再调用命令查询 if [[ -z "${USER_STATUS_CACHE[$USER_EMAIL]}" ]]; then USER_STATUS=$(gcloud identity users describe ${USER_EMAIL} --format='value(isSuspended)') USER_STATUS_CACHE[$USER_EMAIL]=$USER_STATUS fi # 转换状态描述 if [[ "${USER_STATUS_CACHE[$USER_EMAIL]}" == "false" ]]; then STATUS="活跃" else STATUS="非活跃(已停用)" fi echo "所有者: ${USER_EMAIL} - 状态: ${STATUS}" done done
关键说明
- 过滤用户类型:通过
--filter增加bindings.members:user:*,只保留个人用户,排除serviceAccount:、group:等类型的成员 - 缓存优化:用关联数组
USER_STATUS_CACHE存储已查询过的用户状态,避免同一个用户被多次查询,大幅提升数千个项目的处理效率 - 状态判断:
isSuspended为false代表账户正常活跃,true代表账户已被停用(非活跃)
内容的提问来源于stack exchange,提问作者itinneed2022_1
相关产品推荐
相关产品推荐

