-
Notifications
You must be signed in to change notification settings - Fork 12
无人值守模式
ctk 除了交互式 REPL,也提供无人值守 CLI(headless mode):单条命令完成"枚举 / 创删账户 / 列桶 / 下发命令 / 角色绑定 / 凭据轮换"等动作,便于编排到 CI、验证脚本、Runbook、定时任务里。
无人值守模式与 REPL 共用同一套 provider / payload 实现,差异只在入口与输出:
- 入口:通过
ctk <provider> <action>或ctk <action> -P <profile>触发,无需进入 REPL - 输出:
--json切换为结构化 JSON(适合 SIEM 摄取与脚本消费),默认仍是 REPL 同款表格 / 文本 - 退出码:明确区分 success / partial / approval / config error / unsupported,便于编排判断
⚠️ 责任使用:headless 模式下脚本不会替你判断资产范围、合规边界与命令安全。把--yes写进 CI 之前,请明确该验证流程的目标实例 / 资源 / 身份均已显式授权。
ctk # 进入 REPL
ctk -h | --help # 帮助
ctk -v # 版本
ctk <provider> <action> [args] [flags] # 显式提供 provider
ctk <action> [args] (-P <profile> | --creds <file> | --stdin) [flags] # provider 由凭据来源推断
所有 action 都是对应 payload 的快捷形式;--metadata 不与 action 共用(除非通过 REPL 路径直接走 payload)。
| Action | 对应 payload | 用法 | 说明 |
|---|---|---|---|
ls [resource[,resource...]] |
cloudlist |
列出云资源 | 不带参数 = 全量;带参数限定类别(balance,host,bucket,...) |
| Action | 对应 payload | 用法 | 说明 |
|---|---|---|---|
useradd <username> <password> |
iam-user-check |
创建测试 IAM 用户 | |
userdel <username> |
iam-user-check |
删除测试 IAM 用户 | |
roleadd <principal> <role> [scope] |
role-binding-check |
给身份绑定角色 / 策略 | scope 可选(Azure RBAC / GCP project IAM 用) |
roledel <principal> <role> [scope] |
role-binding-check |
解绑 | |
expose <bucket> <level> |
bucket-acl-check |
把桶设为公开级 ACL | level: public-read / public-read-write / 别名 |
unexpose <bucket> |
bucket-acl-check |
撤回为 private | |
keyadd <principal> |
iam-credential-check |
为身份签发长期凭据 | 输出含 secret,注意保管 |
keydel <principal> <credentialID> |
iam-credential-check |
撤销凭据 | |
shell <instance-id> <cmd...> -r <region> (-sh | -cmd) |
instance-cmd-check |
单条命令下发 | 必须带 -r;-sh 走 shell 解释器,-cmd 直接 exec |
| Action | 对应 payload | 用法 | 说明 |
|---|---|---|---|
bls [bucket] |
bucket-check |
列出 bucket 对象 | 不带参数 = list all
|
bcnt [bucket] |
bucket-check |
统计 bucket 对象数 | 不带参数 = total all
|
rolels <principal> |
role-binding-check |
列出身份当前已绑定的角色 / 策略 | |
bacl [bucket] |
bucket-acl-check |
审计桶 ACL 当前状态 | |
keyls <principal> |
iam-credential-check |
列出身份的长期凭据 |
action 是否在某 provider 上可用,由该 provider 实现的能力接口决定。运行不支持的组合会以退出码 5 报错(<provider> does not support <payload>)。
headless 模式下提供四种互斥的凭据来源,按优先级生效:
-
-P <profile>/--profile <profile>—— 从已落盘的 会话缓存中按note或UUID取出。最常用,配合 REPL 里note <id> <name>可以给会话起易记名字。 -
--creds <file>—— 读取一个本地 JSON 文件,格式见下;适合 CI 把凭据挂成 secret 文件。 -
--stdin—— 从 stdin 读取同样格式的 JSON;适合 vault/secrets manager 的... | ctk ...管道。 -
直接传
-k/-s/-r/--clientId等 provider flag —— 即时凭据,不落盘也不缓存。
--profile / --creds / --stdin 三者会推断 provider,因此可以省略 <provider> 位置参数;-k/-s 等单独使用时必须显式给出 <provider>。
字段名与 set <key> <value> 对应,一份完整示例:
{
"provider": "tencent",
"accesskey": "AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE",
"secretkey": "Gu5t9xGARNpq86cd98joQYCN3EXAMPLE",
"token": "",
"region": "ap-guangzhou",
"version": "Global"
}Azure 改用四元组:provider=azure + clientId / clientSecret / tenantId / subscriptionId。GCP 用 provider=gcp + base64Json(base64 后的 service account JSON)。UCloud 用 provider=ucloud + 标准 AK/SK + 可选 projectId。
文件权限建议 0600,避免与他人共享宿主机时泄露。
| Flag | 作用 |
|---|---|
--json |
切换为 JSON 输出。当前 9 个 payload 全部已实现 ResultProducer,均可走 --json
|
--quiet |
关闭 debug 日志,processbar 仍然到 stderr |
-y, --yes
|
显式授权敏感动作(useradd / userdel / shell / roleadd / roledel / expose / unexpose / keyadd / keydel),缺失则不在 TTY 下直接以退出码 3 拒绝执行 |
--metadata <value> |
直接覆盖 metadata(与 action 互斥,主要给验证脚本兜底) |
| Code | 含义 |
|---|---|
0 |
全部成功 |
2 |
部分失败(例如 cloudlist 某些 region 失败但仍有产出) |
3 |
敏感操作未获 --yes 授权 |
4 |
配置错误(缺参数、JSON 解析失败、profile 不存在等) |
5 |
当前 provider 不支持该 payload |
编排时建议按 0 / 2 / 其他 三档判定:成功、部分成功、需要人介入。
ctk tencent ls -P lab-tencent --json --quiet > inventory-tencent.json echo "exit: $?" # 0 全成功 / 2 部分失败
# 仅取 host 与 bucket 两个类别
ctk tencent ls host,bucket -P lab-tencent --jsonctk tencent useradd ctk-validation-user "$(pwgen -s 24 1)" -P lab-tencent -y # ... 跑检测验证 ... ctk tencent userdel ctk-validation-user -P lab-tencent -y
ctk azure roleadd 11111111-2222-3333-4444-000000000099 Reader \ /subscriptions/<sub>/resourceGroups/lab -P lab-azure -y ctk azure rolels 11111111-2222-3333-4444-000000000099 -P lab-azure --json ctk azure roledel 11111111-2222-3333-4444-000000000099 Reader \ /subscriptions/<sub>/resourceGroups/lab -P lab-azure -y
ctk aws bacl -P lab-aws --json # 审计当前 ACL ctk aws expose ctk-validation public-read -P lab-aws -y # 切公开(仅 Lab 桶) ctk aws unexpose ctk-validation -P lab-aws -y # 撤回 private
ctk aws keyls ctk-bot -P lab-aws --json ctk aws keyadd ctk-bot -P lab-aws -y ctk aws keydel ctk-bot AKIA... -P lab-aws -y
ctk huawei bls -P lab-huawei # 全部 bucket ctk huawei bls my-validation -P lab-huawei # 单 bucket ctk huawei bcnt -P lab-huawei --json # 仅统计
ctk tencent shell ins-xxxxx123 "id && hostname" -r ap-chengdu -sh -P lab-tencent -y ctk tencent shell ins-xxxxx123 "uname -a" -r ap-chengdu -cmd -P lab-tencent -y
vault kv get -format=json secret/cloud/lab-aws \ | jq '{provider:"aws", accesskey:.data.data.k, secretkey:.data.data.s, region:"us-east-1"}' \ | ctk ls --stdin --json
- 通过 REPL 跑过一次
run后产生的会话,可直接被 headless 用-P <note>调用:在 REPL 里note 1 lab-tencent之后,shell 里ctk tencent ls -P lab-tencent即可生效 -
--creds文件可以由 REPL 的sessions列表手工导出,也可以由配置管理工具直接渲染 - headless 与 REPL 共享
~/.config/cloudtoolkit/config.yaml,common.timeout_minutes/cloudlist/iam-user-check/rds-account-check等字段在两边都生效
- 在非 TTY 环境(CI / 管道)下,敏感动作必须通过
-y显式授权;-y不会自动转嫁到 nested confirm -
cloudlist走--json时,部分失败仍会返回完整 result,并以退出码2标记 -
--profile不存在时退出码4,且会提示profile not found: <name>,便于 CI fail-fast -
roleadd/roledel在不同云上的 scope 语义不同:Azure 走 ARM scope(/subscriptions/<sub>/...)、GCP 走 project ID、AWS scope 字段保留未用