| name | qshell |
| description | Operate Qiniu Cloud KODO object storage via qshell CLI. Covers file CRUD, batch operations, CDN refresh/prefetch, data processing, file sharing, M3U8 operations, and sandbox management.
|
| type | tool |
| best_for | ["Managing Qiniu Cloud KODO object storage resources","Batch file operations (upload, download, copy, move, delete)","CDN cache refresh and prefetch","Cloud sandbox environment management","File sharing and private link generation"] |
| scenarios | ["Upload local files to a Qiniu bucket","List and query files in a bucket with prefix filtering","Batch delete expired files from storage","Refresh CDN cache after updating resources","Create and manage sandbox environments","Generate private download links for restricted files","Migrate data from AWS S3 or Alibaba Cloud OSS to Qiniu"] |
七牛 KODO 资源操作 (qshell)
通过 qshell CLI 操作七牛云 KODO 对象存储及沙箱计算资源。
前置条件
qshell 通过系统 PATH 查找,直接使用 qshell 命令调用。
使用策略
不要提前检查 qshell 是否安装。 直接执行用户请求的 qshell 命令。仅当命令执行失败(如 command not found、no such file or directory、exit code 127)时,告知用户 qshell 未安装,并询问是否需要自动安装。获得用户同意后,执行 references/install.sh 安装(如需了解脚本细节可阅读 references/install.md),然后重新执行命令。
账号未配置时
如果命令返回 bad token / unauthorized / 401 错误,提示用户运行:
qshell account <AccessKey> <SecretKey> <Name>
安全规则: 当执行 qshell account 设置凭据时,必须 在命令前加一个空格,以防止 AccessKey 和 SecretKey 被记录在 shell 历史中。例如: qshell account <AK> <SK> <Name>
沙箱功能鉴权
沙箱相关命令需要配置环境变量:
QINIU_API_KEY 或 E2B_API_KEY:API 密钥(必填)
QINIU_SANDBOX_API_URL 或 E2B_API_URL:API 服务地址(可选)
优先级:QINIU_* > E2B_*
命令速查
1. 账号与 Bucket 管理
qshell account
qshell account <AccessKey> <SecretKey> <Name>
qshell user ls
qshell user cu <Name>
qshell user current
qshell user lookup <Name>
qshell buckets
qshell buckets --detail
qshell buckets --region z0
qshell bucket <Bucket>
qshell mkbucket <Bucket> --region z0
qshell mkbucket <Bucket> --region z1
qshell mkbucket <Bucket> --region z2
qshell mkbucket <Bucket> --region na0
qshell mkbucket <Bucket> --region as0
qshell mkbucket <Bucket> --region z0 --private
qshell domains <Bucket>
qshell domains <Bucket> --detail
2. 文件查询
qshell stat <Bucket> <Key>
qshell listbucket2 <Bucket>
qshell listbucket2 <Bucket> -p <Prefix>
qshell listbucket2 <Bucket> -p <Prefix> --limit 100
qshell listbucket2 <Bucket> -o result.txt
qshell listbucket2 <Bucket> -r
qshell listbucket2 <Bucket> -s 2024-01-01-00-00-00
qshell listbucket2 <Bucket> -e 2024-12-31-23-59-59
qshell listbucket2 <Bucket> --file-types 0,1
qshell listbucket2 <Bucket> --min-file-size 1048576
qshell listbucket2 <Bucket> --show-fields Key,FileSize,PutTime
qshell listbucket <Bucket> <OutputFile>
qshell batchstat <Bucket> -i <KeyListFile>
qshell match <Bucket> <Key> <LocalFile>
qshell batchmatch <Bucket> -i <KeyLocalFile>
listbucket2 输出格式(默认 tab 分隔):
Key FileSize Hash PutTime MimeType FileType EndUser
存储类型 FileType:
- 0: 标准存储 (STANDARD)
- 1: 低频存储 (IA)
- 2: 归档存储 (ARCHIVE)
- 3: 深度归档 (DEEP_ARCHIVE)
- 4: 归档直读 (ARCHIVE_IR)
- 5: 智能分层 (INTELLIGENT_TIERING)
3. 文件上传
选择策略: 文件 < 100MB 使用 fput(表单上传),>= 100MB 使用 rput(分片上传)。
qshell fput <Bucket> <Key> <LocalFile>
qshell fput <Bucket> <Key> <LocalFile> --overwrite
qshell fput <Bucket> <Key> <LocalFile> --file-type 1
qshell fput <Bucket> <Key> <LocalFile> -t image/png
qshell rput <Bucket> <Key> <LocalFile>
qshell rput <Bucket> <Key> <LocalFile> --overwrite
qshell rput <Bucket> <Key> <LocalFile> --resumable-api-v2
qshell rput <Bucket> <Key> <LocalFile> -c 10
qshell qupload2 --src-dir <LocalDir> --bucket <Bucket>
qshell qupload2 --src-dir <LocalDir> --bucket <Bucket> --key-prefix "dir/" --overwrite
qshell qupload2 --src-dir <LocalDir> --bucket <Bucket> --thread-count 10
qshell qupload2 --src-dir <LocalDir> --bucket <Bucket> --skip-suffixes .tmp,.log
qshell qupload2 --src-dir <LocalDir> --bucket <Bucket> --check-exists
qshell qupload <UploadConfigFile>
4. 文件下载
qshell get <Bucket> <Key>
qshell get <Bucket> <Key> -o <LocalFile>
qshell get <Bucket> <Key> --domain <Domain>
qshell get <Bucket> <Key> --check-hash
qshell get <Bucket> <Key> --enable-slice
qshell qdownload2 --bucket <Bucket> --dest-dir <LocalDir>
qshell qdownload2 --bucket <Bucket> --dest-dir <LocalDir> --prefix "logs/"
qshell qdownload2 --bucket <Bucket> --dest-dir <LocalDir> -c 10
qshell qdownload2 --bucket <Bucket> --dest-dir <LocalDir> --domain <Domain>
qshell qdownload2 --bucket <Bucket> --dest-dir <LocalDir> --key-file <KeyFile>
qshell qdownload <DownloadConfigFile>
5. 文件操作
qshell copy <SrcBucket> <SrcKey> <DestBucket> -k <DestKey>
qshell copy <SrcBucket> <SrcKey> <DestBucket>
qshell copy <SrcBucket> <SrcKey> <DestBucket> -k <DestKey> --overwrite
qshell move <SrcBucket> <SrcKey> <DestBucket> -k <DestKey>
qshell move <Bucket> <OldKey> <Bucket> -k <NewKey>
qshell rename <Bucket> <OldKey> <NewKey>
qshell delete <Bucket> <Key>
qshell fetch <RemoteURL> <Bucket> -k <Key>
qshell sync <SrcResUrl> <Bucket> -k <Key>
qshell sync <SrcResUrl> <Bucket> -k <Key> --overwrite
qshell sync <SrcResUrl> <Bucket> -k <Key> --file-type 1
qshell mirrorupdate <Bucket> <Key>
qshell prefetch <Bucket> <Key>
qshell batchcopy <SrcBucket> <DestBucket> -i <MapFile>
qshell batchmove <SrcBucket> <DestBucket> -i <MapFile>
qshell batchdelete <Bucket> -i <KeyListFile>
qshell batchrename <Bucket> -i <OldNewKeyMapFile>
qshell batchfetch <Bucket> -i <URLKeyMapFile>
安全提示: 批量删除/移动操作默认需要输入验证码确认,可加 -y 跳过确认直接执行。执行前务必确认操作范围。
建议先用 --success-list 和 --failure-list 记录结果。
6. 文件属性修改
qshell chgm <Bucket> <Key> <NewMimeType>
qshell chtype <Bucket> <Key> <FileType>
qshell expire <Bucket> <Key> <DeleteAfterDays>
qshell forbidden <Bucket> <Key>
qshell forbidden <Bucket> <Key> -r
qshell restorear <Bucket> <Key> <FreezeAfterDays>
qshell chlifecycle <Bucket> <Key> \
--to-ia-after-days 30 \
--to-archive-ir-after-days 60 \
--to-archive-after-days 120 \
--to-deep-archive-after-days 180 \
--delete-after-days 365
qshell batchchgm <Bucket> -i <KeyMimeFile>
qshell batchchtype <Bucket> -i <KeyTypeFile>
qshell batchexpire <Bucket> -i <KeyDaysFile>
qshell batchforbidden <Bucket> -i <KeyListFile>
qshell batchrestorear <Bucket> -i <KeyDaysFile>
qshell batchchlifecycle <Bucket> -i <LifecycleFile>
7. CDN 操作
qshell cdnrefresh -i <URLListFile>
qshell cdnrefresh -i <URLListFile> -r
qshell cdnprefetch -i <URLListFile>
echo "http://example.com/path/file.jpg" | qshell cdnrefresh
echo "http://example.com/path/file.jpg" | qshell cdnprefetch
8. 数据处理 (pfop)
qshell pfop <Bucket> <Key> <FopCommand>
qshell pfop <Bucket> <Key> <FopCommand> -p <Pipeline>
qshell pfop <Bucket> <Key> <FopCommand> -u <NotifyURL>
qshell prefop <PersistentId>
9. 私有链接与签名
qshell privateurl <PublicURL>
qshell privateurl <PublicURL> <Deadline>
qshell saveas <PublicUrlWithFop> <SaveBucket> <SaveKey>
qshell batchsign -i <URLListFile>
qshell token
10. 工具命令
qshell reqid <ReqId>
qshell qetag <LocalFilePath>
qshell b64encode <String>
qshell b64decode <EncodedString>
qshell rpcencode <String>
qshell rpcdecode <EncodedString>
qshell urlencode <String>
qshell urldecode <EncodedString>
qshell d2ts <Seconds>
qshell tms2d <TimestampInMs>
qshell tns2d <TimestampInNs>
qshell ts2d <TimestampInSec>
qshell ip <IPAddress>
qshell dircache <DirPath> -o <OutputFile>
qshell unzip <ZipFilePath> --dir <UnzipToDir>
qshell func <ParamsJson> <FuncTemplate>
qshell version
11. 异步抓取与云迁移
qshell abfetch -i <URLKeyFile> <Bucket>
qshell acheck <Bucket> <Id> --zone <Zone>
qshell awslist -A <AwsID> -S <AwsSecretKey> <AwsBucket> <AwsRegion>
qshell awsfetch -A <AwsID> -S <AwsSecretKey> <AwsBucket> <AwsRegion> <QiniuBucket>
qshell alilistbucket <DataCenter> <Bucket> <AccessKeyId> <AccessKeySecret> [Prefix] <ListBucketResultFile>
12. 文件分享
qshell create-share kodo://<Bucket>/<Prefix>
qshell create-share kodo://<Bucket>/<Prefix> --extract-code <Code>
qshell create-share kodo://<Bucket>/<Prefix> --validity-period 1h
qshell create-share kodo://<Bucket>/<Prefix> --output share.json
qshell share-ls <ShareLink>
qshell share-ls share.json
qshell share-ls <ShareLink> --prefix <Prefix>
qshell share-ls <ShareLink> --limit 100
qshell share-ls <ShareLink> --extract-code <Code>
qshell share-cp <ShareLink> --to <LocalDir>
qshell share-cp <ShareLink> --to <LocalDir> -r
qshell share-cp share.json --from <Path> --to <LocalDir>
13. M3U8 操作
qshell m3u8delete <Bucket> <M3u8Key>
qshell m3u8replace <Bucket> <M3u8Key>
qshell m3u8replace <Bucket> <M3u8Key> <NewDomain>
14. 沙箱管理
需要配置 QINIU_API_KEY 或 E2B_API_KEY 环境变量。
别名:sandbox = sbx
qshell sandbox list
qshell sbx ls
qshell sandbox list -s running,paused
qshell sandbox list -m key=value
qshell sandbox list -f json
qshell sandbox create <TemplateID> -d
qshell sbx cr <TemplateID> -d
qshell sandbox create <TemplateID> -d -t 300
qshell sandbox create <TemplateID> -d -m env=dev
qshell sandbox connect <SandboxID>
qshell sbx cn <SandboxID>
qshell sandbox exec <SandboxID> -- <Command>
qshell sbx ex <SandboxID> -- ls -la
qshell sandbox exec <SandboxID> -b -- python server.py
qshell sandbox exec <SandboxID> -c /app -- npm install
qshell sandbox exec <SandboxID> -e PORT=3000 -- node app.js
qshell sandbox kill <SandboxID>
qshell sbx kl <SandboxID>
qshell sandbox kill -a
qshell sandbox kill -a -m user=alice
qshell sandbox pause <SandboxID>
qshell sbx ps <SandboxID>
qshell sandbox pause -a
qshell sandbox resume <SandboxID>
qshell sandbox resume -a
qshell sandbox logs <SandboxID>
qshell sbx lg <SandboxID>
qshell sandbox metrics <SandboxID>
qshell sbx mt <SandboxID>
15. 沙箱模板管理
别名:sandbox template = sbx tpl
qshell sandbox template list
qshell sbx tpl ls
qshell sandbox template get <TemplateID>
qshell sbx tpl gt <TemplateID>
qshell sandbox template delete <TemplateID> -y
qshell sbx tpl dl <TemplateID> -y
qshell sandbox template build --name <Name> --from-image ubuntu:22.04 --wait
qshell sbx tpl bd --name <Name> --from-image ubuntu:22.04 --wait
qshell sandbox template builds <TemplateID> <BuildID>
qshell sbx tpl bds <TemplateID> <BuildID>
qshell sandbox template publish <TemplateID> -y
qshell sandbox template unpublish <TemplateID> -y
qshell sandbox template init
qshell sandbox template init --name my-template --language go
qshell sandbox template init --name my-api --language typescript --path ./my-api
支持的语言: go, typescript, python
用户意图到操作的映射
下表仅列出存在歧义或需要判断的场景,简单的一对一映射请参考命令速查部分。
| 用户说 | 操作 | 判断依据 |
|---|
| "上传文件到七牛" | qshell fput(< 100MB)/ qshell rput(>= 100MB) | 根据文件大小选择 |
| "批量上传" | qshell qupload2 | 上传整个目录 |
| "从远程 URL 抓取文件" | qshell fetch(小文件) / qshell sync(大文件或需断点续传) | fetch 适合小文件,sync 支持分片和断点续传 |
| "同步文件到七牛" | qshell sync | 大文件或需断点续传时优先 |
| "从 S3 迁移" | qshell awsfetch | 需要 AWS 凭据 |
| "从阿里云迁移" | qshell alilistbucket + qshell batchfetch | 先列举再批量抓取 |
| "刷新 CDN" | qshell cdnrefresh | URL 刷新 |
| "预热 CDN" | qshell cdnprefetch | URL 预取 |
| "改一下存储类型" | qshell chtype(单文件) / qshell batchchtype(批量) | 根据操作规模选择 |
| "设置文件生命周期" | qshell chlifecycle(单文件) / qshell batchchlifecycle(批量) | 根据操作规模选择 |
| "移动文件" / "重命名文件" | qshell rename(同 bucket)/ qshell move(跨 bucket) | 根据是否跨 bucket 选择 |
| "删除 m3u8" | qshell m3u8delete | 会同时删除所有切片文件 |
| "创建沙箱" | qshell sandbox create <TemplateID> -d | AI 助手必须使用 -d 分离模式 |
| "生成 token" | qshell token | 交互式命令,提示用户手动运行 |
安全规则
危险操作(必须与用户确认后再执行)
qshell account <AK> <SK> <Name> — 会覆盖当前账号配置,涉及凭据安全
qshell delete / qshell batchdelete — 删除文件不可恢复
qshell move / qshell batchmove — 源文件会被删除
qshell rename / qshell batchrename — 重命名实质是移动
qshell forbidden — 禁用文件访问
qshell batchexpire — 批量设置过期可能导致数据丢失
qshell m3u8delete — 删除 M3U8 及所有切片文件
qshell sandbox kill / qshell sandbox kill -a — 终止沙箱
qshell sandbox connect — 交互式终端,AI 助手无法操作,需提示用户手动执行
qshell sandbox template delete — 删除模板
- 任何带
--overwrite 的上传/复制/同步操作
qshell token — 交互式命令,AI 助手无法操作,需提示用户手动执行
安全操作(可直接执行)
- 所有查询类:
stat、listbucket2、buckets、bucket、domains、prefop、batchstat
- 工具类:
reqid、qetag、match、b64encode、b64decode、urlencode、urldecode、rpcencode、rpcdecode、ip、d2ts、tms2d、tns2d、ts2d、func、dircache、unzip、version
- 链接生成:
privateurl、saveas、batchsign、create-share
- 分享查看:
share-ls
- 沙箱查询:
sandbox list、sandbox logs、sandbox metrics、sandbox template list、sandbox template get、sandbox template builds、sandbox template init
输出格式
文件信息 (stat)
## 文件信息: <Bucket>/<Key>
| 属性 | 值 |
|------|-----|
| Key | path/to/file.jpg |
| 大小 | 1.5 MB |
| Hash | Fh8... |
| MIME | image/jpeg |
| 存储类型 | 标准存储 |
| 上传时间 | 2024-03-01 10:30:00 |
文件列表 (listbucket2)
## <Bucket> 文件列表 (前缀: <Prefix>)
| Key | 大小 | MIME | 存储类型 | 上传时间 |
|-----|------|------|----------|----------|
| file1.jpg | 1.5 MB | image/jpeg | 标准 | 2024-03-01 |
| file2.pdf | 3.2 MB | application/pdf | 低频 | 2024-02-15 |
共 N 个文件,总大小 X MB
沙箱列表 (sandbox list)
## 沙箱列表
| SANDBOX ID | TEMPLATE ID | STATE | vCPUs | RAM MiB | STARTED AT |
|------------|-------------|-------|-------|---------|------------|
| sb-xxx | tmpl-xxx | running | 2 | 512 | 2024-03-01 10:00 |
错误处理
| 错误 | 处理方式 |
|---|
command not found / exit 127 | qshell 未安装,执行 references/install.sh 安装 |
no such file or directory | 检查本地文件路径 |
no such bucket / 631 | 检查 bucket 名称,用 qshell buckets 列出可用 bucket |
no such file or key / 612 | 检查文件 key 是否正确 |
bad token / unauthorized / 401 | 账号配置问题,提示 qshell account 重新配置 |
bucket not match | 操作的 bucket 与 key 不匹配 |
file exists / 614 | 文件已存在,需要加 --overwrite 选项 |
403 | 权限不足 |
API key not configured | 沙箱功能需设置 QINIU_API_KEY 环境变量 |
sandbox not found | 检查沙箱 ID,用 qshell sandbox list 查看 |
template not found | 检查模板 ID,用 qshell sandbox template list 查看 |