24# 七牛 KODO 资源操作 (qshell)
25
26通过 qshell CLI 操作七牛云 KODO 对象存储及沙箱计算资源。
27
28## 前置条件
29
30qshell 通过系统 PATH 查找,直接使用 qshell 命令调用。
31
32### 使用策略
33
34**不要提前检查 qshell 是否安装。** 直接执行用户请求的 qshell 命令。仅当命令执行失败(如 command not found、no such file or directory、exit code 127)时,告知用户 qshell 未安装,并询问是否需要自动安装。获得用户同意后,执行 references/install.sh 安装(如需了解脚本细节可阅读 references/install.md),然后重新执行命令。
35
36### 账号未配置时
37
38如果命令返回 bad token / unauthorized / 401 错误,提示用户运行:
39```bash
40qshell account <AccessKey> <SecretKey> <Name>
41```
42
43> **安全规则:** 当执行 qshell account 设置凭据时,**必须** 在命令前加一个空格,以防止 AccessKey 和 SecretKey 被记录在 shell 历史中。例如: qshell account <AK> <SK> <Name>
44
45### 沙箱功能鉴权
46
47沙箱相关命令需要配置环境变量:
48- QINIU_API_KEY 或 E2B_API_KEY:API 密钥(必填)
49- QINIU_SANDBOX_API_URL 或 E2B_API_URL:API 服务地址(可选)
50
51优先级:QINIU_* > E2B_*
52
53---
54
55## 命令速查
56
57### 1. 账号与 Bucket 管理
58
59```bash
60# 设置/查看当前账号
61qshell account # 查看当前账号
62qshell account <AccessKey> <SecretKey> <Name> # 设置账号
63
64# 用户管理
65qshell user ls # 列出所有已配置账号
66qshell user cu <Name> # 切换当前账号
67qshell user current # 查看当前用户
68qshell user lookup <Name> # 查看指定账号详情
69
70# 列出所有 bucket
71qshell buckets
72qshell buckets --detail # 带详情
73qshell buckets --region z0 # 指定区域
74
75# 查看 bucket 信息
76qshell bucket <Bucket>
77
78# 创建 bucket
79qshell mkbucket <Bucket> --region z0 # 华东
80qshell mkbucket <Bucket> --region z1 # 华北
81qshell mkbucket <Bucket> --region z2 # 华南
82qshell mkbucket <Bucket> --region na0 # 北美
83qshell mkbucket <Bucket> --region as0 # 东南亚
84qshell mkbucket <Bucket> --region z0 --private # 创建私有 bucket
85
86# 查看 bucket 绑定的域名
87qshell domains <Bucket>
88qshell domains <Bucket> --detail
89```
90
91### 2. 文件查询
92
93```bash
94# 查看单个文件信息
95qshell stat <Bucket> <Key>
96
97# 列举 bucket 中的文件
98qshell listbucket2 <Bucket> # 列出所有文件
99qshell listbucket2 <Bucket> -p <Prefix> # 按前缀列举
100qshell listbucket2 <Bucket> -p <Prefix> --limit 100 # 限制数量
101qshell listbucket2 <Bucket> -o result.txt # 输出到文件
102qshell listbucket2 <Bucket> -r # 人类可读的文件大小
103qshell listbucket2 <Bucket> -s 2024-01-01-00-00-00 # 起始时间
104qshell listbucket2 <Bucket> -e 2024-12-31-23-59-59 # 结束时间
105qshell listbucket2 <Bucket> --file-types 0,1 # 按存储类型过滤
106qshell listbucket2 <Bucket> --min-file-size 1048576 # 最小文件大小 (1MB)
107qshell listbucket2 <Bucket> --show-fields Key,FileSize,PutTime # 指定显示字段
108
109# 旧版列举(兼容)
110qshell listbucket <Bucket> <OutputFile>
111
112# 批量查看文件信息(从文件或 stdin 读取 key 列表)
113qshell batchstat <Bucket> -i <KeyListFile>
114
115# 校验本地文件与云端文件是否一致
116qshell match <Bucket> <Key> <LocalFile>
117
118# 批量校验
119qshell batchmatch <Bucket> -i <KeyLocalFile> # 每行: Key\tLocalPath
120```
121
122**listbucket2 输出格式(默认 tab 分隔):**
123```
124Key FileSize Hash PutTime MimeType FileType EndUser
125```
126
127**存储类型 FileType:**
128- 0: 标准存储 (STANDARD)
129- 1: 低频存储 (IA)
130- 2: 归档存储 (ARCHIVE)
131- 3: 深度归档 (DEEP_ARCHIVE)
132- 4: 归档直读 (ARCHIVE_IR)
133- 5: 智能分层 (INTELLIGENT_TIERING)
134
135### 3. 文件上传
136
137**选择策略:** 文件 < 100MB 使用 fput(表单上传),>= 100MB 使用 rput(分片上传)。
138
139```bash
140# 表单上传(适合 < 100MB 的文件)
141qshell fput <Bucket> <Key> <LocalFile>
142qshell fput <Bucket> <Key> <LocalFile> --overwrite # 覆盖同名
143qshell fput <Bucket> <Key> <LocalFile> --file-type 1 # 上传为低频存储
144qshell fput <Bucket> <Key> <LocalFile> -t image/png # 指定 MIME 类型
145
146# 分片上传(>= 100MB 的文件,支持断点续传)
147qshell rput <Bucket> <Key> <LocalFile>
148qshell rput <Bucket> <Key> <LocalFile> --overwrite
149qshell rput <Bucket> <Key> <LocalFile> --resumable-api-v2 # 使用 v2 分片
150qshell rput <Bucket> <Key> <LocalFile> -c 10 # 10 个并发分片
151
152# 批量上传目录
153qshell qupload2 --src-dir <LocalDir> --bucket <Bucket>
154qshell qupload2 --src-dir <LocalDir> --bucket <Bucket> --key-prefix "dir/" --overwrite
155qshell qupload2 --src-dir <LocalDir> --bucket <Bucket> --thread-count 10
156qshell qupload2 --src-dir <LocalDir> --bucket <Bucket> --skip-suffixes .tmp,.log
157qshell qupload2 --src-dir <LocalDir> --bucket <Bucket> --check-exists # 跳过已存在
158
159# 旧版批量上传(使用配置文件)
160qshell qupload <UploadConfigFile>
161```
162
163### 4. 文件下载
164
165```bash
166# 下载单个文件
167qshell get <Bucket> <Key>
168qshell get <Bucket> <Key> -o <LocalFile> # 指定保存路径
169qshell get <Bucket> <Key> --domain <Domain> # 指定下载域名
170qshell get <Bucket> <Key> --check-hash # 下载后校验 hash
171qshell get <Bucket> <Key> --enable-slice # 分片下载大文件
172
173# 批量下载
174qshell qdownload2 --bucket <Bucket> --dest-dir <LocalDir>
175qshell qdownload2 --bucket <Bucket> --dest-dir <LocalDir> --prefix "logs/"
176qshell qdownload2 --bucket <Bucket> --dest-dir <LocalDir> -c 10 # 10 并发
177qshell qdownload2 --bucket <Bucket> --dest-dir <LocalDir> --domain <Domain>
178qshell qdownload2 --bucket <Bucket> --dest-dir <LocalDir> --key-file <KeyFile>
179
180# 旧版批量下载(使用配置文件)
181qshell qdownload <DownloadConfigFile>
182```
183
184### 5. 文件操作
185
186```bash
187# 复制文件
188qshell copy <SrcBucket> <SrcKey> <DestBucket> -k <DestKey>
189qshell copy <SrcBucket> <SrcKey> <DestBucket> # key 不变
190qshell copy <SrcBucket> <SrcKey> <DestBucket> -k <DestKey> --overwrite
191
192# 移动文件
193qshell move <SrcBucket> <SrcKey> <DestBucket> -k <DestKey>
194qshell move <Bucket> <OldKey> <Bucket> -k <NewKey> # 同 bucket 重命名
195
196# 重命名文件
197qshell rename <Bucket> <OldKey> <NewKey>
198
199# 删除文件
200qshell delete <Bucket> <Key>
201
202# 抓取远程资源到 bucket(大文件建议使用 sync 命令)
203qshell fetch <RemoteURL> <Bucket> -k <Key>
204
205# 同步远程大文件到 bucket(使用分片上传,支持断点续传,适合大文件)
206qshell sync <SrcResUrl> <Bucket> -k <Key>
207qshell sync <SrcResUrl> <Bucket> -k <Key> --overwrite
208qshell sync <SrcResUrl> <Bucket> -k <Key> --file-type 1 # 指定存储类型
209
210# 镜像更新(从源站重新拉取覆盖旧文件)
211qshell mirrorupdate <Bucket> <Key>
212qshell prefetch <Bucket> <Key> # 同 mirrorupdate
213
214# 批量操作(从文件或 stdin 读取列表)
215qshell batchcopy <SrcBucket> <DestBucket> -i <MapFile> # 每行: SrcKey\tDestKey
216qshell batchmove <SrcBucket> <DestBucket> -i <MapFile>
217qshell batchdelete <Bucket> -i <KeyListFile> # 每行一个 key
218qshell batchrename <Bucket> -i <OldNewKeyMapFile> # 每行: OldKey\tNewKey
219qshell batchfetch <Bucket> -i <URLKeyMapFile> # 每行: URL\tKey
220```
221
222> **安全提示:** 批量删除/移动操作默认需要输入验证码确认,可加 -y 跳过确认直接执行。执行前务必确认操作范围。
223> 建议先用 --success-list 和 --failure-list 记录结果。
224
225### 6. 文件属性修改
226
227```bash
228# 修改 MIME 类型
229qshell chgm <Bucket> <Key> <NewMimeType>
230
231# 修改存储类型
232qshell chtype <Bucket> <Key> <FileType> # 0/1/2/3/4/5
233
234# 设置文件过期时间(天数,0 表示取消过期)
235qshell expire <Bucket> <Key> <DeleteAfterDays>
236
237# 禁用/启用文件访问
238qshell forbidden <Bucket> <Key> # 禁用
239qshell forbidden <Bucket> <Key> -r # 取消禁用
240
241# 解冻归档文件(FreezeAfterDays: 1~7 天)
242qshell restorear <Bucket> <Key> <FreezeAfterDays>
243
244# 修改文件生命周期(转存储类型、过期删除)
245qshell chlifecycle <Bucket> <Key> \
246 --to-ia-after-days 30 \
247 --to-archive-ir-after-days 60 \
248 --to-archive-after-days 120 \
249 --to-deep-archive-after-days 180 \
250 --delete-after-days 365
251# 设为 -1 表示取消对应的生命周期规则
252
253# 批量操作
254qshell batchchgm <Bucket> -i <KeyMimeFile> # 每行: Key\tMimeType
255qshell batchchtype <Bucket> -i <KeyTypeFile> # 每行: Key\tFileType
256qshell batchexpire <Bucket> -i <KeyDaysFile> # 每行: Key\tDays
257qshell batchforbidden <Bucket> -i <KeyListFile>
258qshell batchrestorear <Bucket> -i <KeyDaysFile> # 每行: Key\tFreezeAfterDays
259qshell batchchlifecycle <Bucket> -i <LifecycleFile> # 批量修改生命周期
260```
261
262### 7. CDN 操作
263
264```bash
265# 刷新 URL 缓存(从文件读取 URL 列表,每行一个 URL)
266qshell cdnrefresh -i <URLListFile>
267qshell cdnrefresh -i <URLListFile> -r # 刷新目录
268
269# 预取 URL(从文件读取 URL 列表)
270qshell cdnprefetch -i <URLListFile>
271
272# 也可以从 stdin 输入
273echo "http://example.com/path/file.jpg" | qshell cdnrefresh
274echo "http://example.com/path/file.jpg" | qshell cdnprefetch
275```
276
277### 8. 数据处理 (pfop)
278
279```bash
280# 触发持久化数据处理
281qshell pfop <Bucket> <Key> <FopCommand>
282qshell pfop <Bucket> <Key> <FopCommand> -p <Pipeline> # 指定队列
283qshell pfop <Bucket> <Key> <FopCommand> -u <NotifyURL> # 通知 URL
284
285# 查询处理状态
286qshell prefop <PersistentId>
287```
288
289### 9. 私有链接与签名
290
291```bash
292# 生成私有资源访问链接
293qshell privateurl <PublicURL> # 默认有效期
294qshell privateurl <PublicURL> <Deadline> # 指定 Unix 时间戳
295
296# 生成带数据处理 + saveas 的 URL
297qshell saveas <PublicUrlWithFop> <SaveBucket> <SaveKey>
298
299# 批量签名(从文件读取 URL 列表)
300qshell batchsign -i <URLListFile>
301
302# 生成各类七牛 Token(交互式,AI 助手无法直接调用,需提示用户手动运行)
303qshell token
304```
305
306### 10. 工具命令
307
308```bash
309# 解码七牛 reqid
310qshell reqid <ReqId>
311
312# 计算本地文件的 qetag
313qshell qetag <LocalFilePath>
314
315# Base64 编解码(URL 安全)
316qshell b64encode <String>
317qshell b64decode <EncodedString>
318
319# RPC 编解码
320qshell rpcencode <String>
321qshell rpcdecode <EncodedString>
322
323# URL 编解码
324qshell urlencode <String>
325qshell urldecode <EncodedString>
326
327# 时间工具
328qshell d2ts <Seconds> # N 秒后的时间戳
329qshell tms2d <TimestampInMs> # 毫秒时间戳转日期
330qshell tns2d <TimestampInNs> # 纳秒时间戳转日期
331qshell ts2d <TimestampInSec> # 秒级时间戳转日期
332
333# IP 查询
334qshell ip <IPAddress>
335
336# 目录缓存(用于批量上传前生成文件列表)
337qshell dircache <DirPath> -o <OutputFile>
338
339# 解压 zip 文件(兼容 GBK/UTF8 文件名)
340qshell unzip <ZipFilePath> --dir <UnzipToDir>
341
342# Go 模板函数(验证模板格式)
343qshell func <ParamsJson> <FuncTemplate>
344
345# 查看版本
346qshell version
347```
348
349### 11. 异步抓取与云迁移
350
351```bash
352# 异步批量抓取远程资源
353qshell abfetch -i <URLKeyFile> <Bucket>
354
355# 查询异步抓取状态
356qshell acheck <Bucket> <Id> --zone <Zone>
357
358# 从 AWS S3 列举
359qshell awslist -A <AwsID> -S <AwsSecretKey> <AwsBucket> <AwsRegion>
360
361# 从 AWS S3 迁移到七牛
362qshell awsfetch -A <AwsID> -S <AwsSecretKey> <AwsBucket> <AwsRegion> <QiniuBucket>
363
364# 从阿里云 OSS 列举
365qshell alilistbucket <DataCenter> <Bucket> <AccessKeyId> <AccessKeySecret> [Prefix] <ListBucketResultFile>
366```
367
368### 12. 文件分享
369
370```bash
371# 创建分享链接
372qshell create-share kodo://<Bucket>/<Prefix>
373qshell create-share kodo://<Bucket>/<Prefix> --extract-code <Code>
374qshell create-share kodo://<Bucket>/<Prefix> --validity-period 1h
375qshell create-share kodo://<Bucket>/<Prefix> --output share.json
376
377# 列举分享内容
378qshell share-ls <ShareLink> # 使用分享链接
379qshell share-ls share.json # 使用输出文件
380qshell share-ls <ShareLink> --prefix <Prefix> # 按前缀过滤
381qshell share-ls <ShareLink> --limit 100 # 限制数量
382qshell share-ls <ShareLink> --extract-code <Code> # 指定提取码
383
384# 从分享下载文件
385qshell share-cp <ShareLink> --to <LocalDir> # 下载文件
386qshell share-cp <ShareLink> --to <LocalDir> -r # 递归下载目录
387qshell share-cp share.json --from <Path> --to <LocalDir> # 下载指定文件
388```
389
390### 13. M3U8 操作
391
392```bash
393# 删除 M3U8 播放列表及其所有切片文件
394qshell m3u8delete <Bucket> <M3u8Key>
395
396# 替换/清除 M3U8 播放列表中的切片域名
397qshell m3u8replace <Bucket> <M3u8Key> # 清除域名(相对路径)
398qshell m3u8replace <Bucket> <M3u8Key> <NewDomain> # 替换为新域名
399```
400
401### 14. 沙箱管理
402
403需要配置 QINIU_API_KEY 或 E2B_API_KEY 环境变量。
404
405别名:sandbox = sbx
406
407```bash
408# 列出沙箱
409qshell sandbox list # 列出运行中的沙箱
410qshell sbx ls # 使用别名
411qshell sandbox list -s running,paused # 按状态过滤
412qshell sandbox list -m key=value # 按元数据过滤
413qshell sandbox list -f json # JSON 格式输出
414
415# 创建沙箱(默认自动连接终端)
416# ⚠ AI 助手应始终使用 -d(分离模式),避免交互式终端阻塞
417qshell sandbox create <TemplateID> -d
418qshell sbx cr <TemplateID> -d
419qshell sandbox create <TemplateID> -d -t 300 # 设置超时 300 秒
420qshell sandbox create <TemplateID> -d -m env=dev # 添加元数据
421
422# 连接到已有沙箱终端
423qshell sandbox connect <SandboxID>
424qshell sbx cn <SandboxID>
425
426# 在沙箱中执行命令
427qshell sandbox exec <SandboxID> -- <Command>
428qshell sbx ex <SandboxID> -- ls -la
429qshell sandbox exec <SandboxID> -b -- python server.py # 后台运行
430qshell sandbox exec <SandboxID> -c /app -- npm install # 指定工作目录
431qshell sandbox exec <SandboxID> -e PORT=3000 -- node app.js # 设置环境变量
432
433# 终止沙箱
434qshell sandbox kill <SandboxID>
435qshell sbx kl <SandboxID>
436qshell sandbox kill -a # 终止所有
437qshell sandbox kill -a -m user=alice # 按元数据过滤终止
438
439# 暂停/恢复沙箱
440qshell sandbox pause <SandboxID>
441qshell sbx ps <SandboxID>
442qshell sandbox pause -a # 暂停所有
443qshell sandbox resume <SandboxID>
444qshell sandbox resume -a # 恢复所有
445
446# 查看沙箱日志
447qshell sandbox logs <SandboxID>
448qshell sbx lg <SandboxID>
449
450# 查看沙箱资源指标
451qshell sandbox metrics <SandboxID>
452qshell sbx mt <SandboxID>
453```
454
455### 15. 沙箱模板管理
456
457别名:sandbox template = sbx tpl
458
459```bash
460# 列出模板
461qshell sandbox template list
462qshell sbx tpl ls
463
464# 查看模板详情
465qshell sandbox template get <TemplateID>
466qshell sbx tpl gt <TemplateID>
467
468# 删除模板
469qshell sandbox template delete <TemplateID> -y
470qshell sbx tpl dl <TemplateID> -y
471
472# 构建模板
473qshell sandbox template build --name <Name> --from-image ubuntu:22.04 --wait
474qshell sbx tpl bd --name <Name> --from-image ubuntu:22.04 --wait
475
476# 查看构建状态
477qshell sandbox template builds <TemplateID> <BuildID>
478qshell sbx tpl bds <TemplateID> <BuildID>
479
480# 发布/取消发布模板
481qshell sandbox template publish <TemplateID> -y
482qshell sandbox template unpublish <TemplateID> -y
483
484# 初始化模板项目脚手架
485qshell sandbox template init
486qshell sandbox template init --name my-template --language go
487qshell sandbox template init --name my-api --language typescript --path ./my-api
488```
489
490**支持的语言:** go, typescript, python
491
492---
493
494## 用户意图到操作的映射
495
496下表仅列出存在歧义或需要判断的场景,简单的一对一映射请参考命令速查部分。
497
498| 用户说 | 操作 | 判断依据 |
499|--------|------|----------|
500| "上传文件到七牛" | qshell fput(< 100MB)/ qshell rput(>= 100MB) | 根据文件大小选择 |
501| "批量上传" | qshell qupload2 | 上传整个目录 |
502| "从远程 URL 抓取文件" | qshell fetch(小文件) / qshell sync(大文件或需断点续传) | fetch 适合小文件,sync 支持分片和断点续传 |
503| "同步文件到七牛" | qshell sync | 大文件或需断点续传时优先 |
504| "从 S3 迁移" | qshell awsfetch | 需要 AWS 凭据 |
505| "从阿里云迁移" | qshell alilistbucket + qshell batchfetch | 先列举再批量抓取 |
506| "刷新 CDN" | qshell cdnrefresh | URL 刷新 |
507| "预热 CDN" | qshell cdnprefetch | URL 预取 |
508| "改一下存储类型" | qshell chtype(单文件) / qshell batchchtype(批量) | 根据操作规模选择 |
509| "设置文件生命周期" | qshell chlifecycle(单文件) / qshell batchchlifecycle(批量) | 根据操作规模选择 |
510| "移动文件" / "重命名文件" | qshell rename(同 bucket)/ qshell move(跨 bucket) | 根据是否跨 bucket 选择 |
511| "删除 m3u8" | qshell m3u8delete | 会同时删除所有切片文件 |
512| "创建沙箱" | qshell sandbox create <TemplateID> -d | AI 助手必须使用 -d 分离模式 |
513| "生成 token" | qshell token | 交互式命令,提示用户手动运行 |
514
515---
516
517## 安全规则
518
519### 危险操作(必须与用户确认后再执行)
520
521- qshell account <AK> <SK> <Name> — 会覆盖当前账号配置,涉及凭据安全
522- qshell delete / qshell batchdelete — 删除文件不可恢复
523- qshell move / qshell batchmove — 源文件会被删除
524- qshell rename / qshell batchrename — 重命名实质是移动
525- qshell forbidden — 禁用文件访问
526- qshell batchexpire — 批量设置过期可能导致数据丢失
527- qshell m3u8delete — 删除 M3U8 及所有切片文件
528- qshell sandbox kill / qshell sandbox kill -a — 终止沙箱
529- qshell sandbox connect — 交互式终端,AI 助手无法操作,需提示用户手动执行
530- qshell sandbox template delete — 删除模板
531- 任何带 --overwrite 的上传/复制/同步操作
532- qshell token — 交互式命令,AI 助手无法操作,需提示用户手动执行
533
534### 安全操作(可直接执行)
535
536- 所有查询类:stat、listbucket2、buckets、bucket、domains、prefop、batchstat
537- 工具类:reqid、qetag、match、b64encode、b64decode、urlencode、urldecode、rpcencode、rpcdecode、ip、d2ts、tms2d、tns2d、ts2d、func、dircache、unzip、version
538- 链接生成:privateurl、saveas、batchsign、create-share
539- 分享查看:share-ls
540- 沙箱查询:sandbox list、sandbox logs、sandbox metrics、sandbox template list、sandbox template get、sandbox template builds、sandbox template init
541
542---
543
544## 输出格式
545
546### 文件信息 (stat)
547
548```
549## 文件信息: <Bucket>/<Key>
550
551| 属性 | 值 |
552|------|-----|
553| Key | path/to/file.jpg |
554| 大小 | 1.5 MB |
555| Hash | Fh8... |
556| MIME | image/jpeg |
557| 存储类型 | 标准存储 |
558| 上传时间 | 2024-03-01 10:30:00 |
559```
560
561### 文件列表 (listbucket2)
562
563```
564## <Bucket> 文件列表 (前缀: <Prefix>)
565
566| Key | 大小 | MIME | 存储类型 | 上传时间 |
567|-----|------|------|----------|----------|
568| file1.jpg | 1.5 MB | image/jpeg | 标准 | 2024-03-01 |
569| file2.pdf | 3.2 MB | application/pdf | 低频 | 2024-02-15 |
570
571共 N 个文件,总大小 X MB
572```
573
574### 沙箱列表 (sandbox list)
575
576```
577## 沙箱列表
578
579| SANDBOX ID | TEMPLATE ID | STATE | vCPUs | RAM MiB | STARTED AT |
580|------------|-------------|-------|-------|---------|------------|
581| sb-xxx | tmpl-xxx | running | 2 | 512 | 2024-03-01 10:00 |
582```
583
584---
585
586## 错误处理
587
588| 错误 | 处理方式 |
589|------|----------|
590| command not found / exit 127 | qshell 未安装,执行 references/install.sh 安装 |
591| no such file or directory | 检查本地文件路径 |
592| no such bucket / 631 | 检查 bucket 名称,用 qshell buckets 列出可用 bucket |
593| no such file or key / 612 | 检查文件 key 是否正确 |
594| bad token / unauthorized / 401 | 账号配置问题,提示 qshell account 重新配置 |
595| bucket not match | 操作的 bucket 与 key 不匹配 |
596| file exists / 614 | 文件已存在,需要加 --overwrite 选项 |
597| 403 | 权限不足 |
598| API key not configured | 沙箱功能需设置 QINIU_API_KEY 环境变量 |
599| sandbox not found | 检查沙箱 ID,用 qshell sandbox list 查看 |
600| template not found | 检查模板 ID,用 qshell sandbox template list 查看 |
601