ossutil 多账号使用指南
2026-06-11 整理。配置文件位于
/workspace/ckpt_downstream/zzm/myApp/ossutilconfig,已通过软链接挂到/root/.ossutilconfig,并由/root/.bashrc末尾的钩子保证软链接始终存在。
配置概览
一份 ossutil 配置文件里有三个 profile:
| profile | endpoint | 拥有的桶 | 备注 |
|---|---|---|---|
cogview-data | oss-cn-beijing-internal.aliyuncs.com | oss://cogview-data/ | 北京内网,本机可达 |
mm-group-image | oss-cn-beijing-internal.aliyuncs.com | oss://mm-group-image/ | 北京内网,本机可达 |
default | oss-cn-wulanchabu-internal.aliyuncs.com | (未知,无权限测) | 乌兰察布内网,本机网络不可达,日常忽略 |
cogview-data 和 mm-group-image 分属两个独立的阿里云账户,桶不互通——某个 AK 只能访问自己账户下的桶,跨桶访问会返回:
AccessDenied: The bucket you access does not belong to you.
日常用法
切账号 = 改 --profile= 的值:
# 列对象
ossutil ls oss://cogview-data/ --profile=cogview-data
ossutil ls oss://mm-group-image/ --profile=mm-group-image
# 上传文件
ossutil cp ./local.txt oss://cogview-data/path/ --profile=cogview-data
ossutil cp ./img.jpg oss://mm-group-image/dir/ --profile=mm-group-image
# 下载文件
ossutil cp oss://cogview-data/foo.json ./ --profile=cogview-data
ossutil cp oss://mm-group-image/img.jpg ./ --profile=mm-group-image
# 同步整个目录
ossutil sync ./local-dir/ oss://cogview-data/dir/ --profile=cogview-data
ossutil sync oss://mm-group-image/dir/ ./local-dir/ --profile=mm-group-image关键陷阱(必读)
/root/.bashrc 里另一个 ppt 数据工具留了一组 OSS_* 环境变量:
OSS_ACCESS_KEY_ID=LTAI5tA4Hm9... # 又一个账户,专给 ppt 数据用的
OSS_ACCESS_KEY_SECRET=nQbwTGxWGjnd...
OSS_ENDPOINT=https://oss-cn-beijing.aliyuncs.com # 公网 endpoint
http_proxy=http://httpproxy.glm.ai:8888 # 公司代理而 ossutil 的凭据优先级是:
命令行参数 > 环境变量 > 配置文件 profile
所以只要这些 env 还在,--profile=xxx 就被劫持成了那个 ppt 账户的 AK,请求又会走代理超时。
解决方案:bashrc 里的 ossutil 包装函数
/root/.bashrc 末尾已经定义了一个同名 shell 函数:
ossutil() {
OSS_ACCESS_KEY_ID= OSS_ACCESS_KEY_SECRET= OSS_ENDPOINT= OSS_BUCKET= \
http_proxy= https_proxy= HTTP_PROXY= HTTPS_PROXY= \
command ossutil "$@"
}它只在交互式 shell 里加载(bashrc 开头有 [ -z "$PS1" ] && return),所以:
- ✅ 新开 terminal、tmux 窗口、登录 shell —— 自动生效,正常
ossutil --profile=xxx ...即可 - ⚠️ 在脚本里 /
bash -c/timeout包裹时 —— 函数不生效,要用下面的「脚本里调用」方式
脚本里调用
timeout、bash -c 等会绕过 shell 函数直接调二进制,env 又会劫持。所以脚本里推荐两种写法:
写法 A:用 env -u 显式 unset
env -u OSS_ACCESS_KEY_ID -u OSS_ACCESS_KEY_SECRET -u OSS_ENDPOINT -u OSS_BUCKET \
-u http_proxy -u https_proxy -u HTTP_PROXY -u HTTPS_PROXY \
ossutil ls oss://cogview-data/ --profile=cogview-data写法 B:脚本开头先 unset
#!/usr/bin/env bash
unset OSS_ACCESS_KEY_ID OSS_ACCESS_KEY_SECRET OSS_ENDPOINT OSS_BUCKET
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
ossutil ls oss://cogview-data/ --profile=cogview-data
# 后续命令同样会用 profile 里的 AK写法 C:完全绕过 profile,直接命令行传 AK
ossutil ls oss://cogview-data/ \
--access-key-id=LTAI5tG2Fy8nYY5QXN85BxWk \
--access-key-secret=uYgwfQvHcXYYr9OLCLCjouk7Sckl0Z \
--endpoint=oss-cn-beijing-internal.aliyuncs.com \
--region=cn-beijing命令行参数优先级最高,env 干扰不到;缺点是要手敲完整凭据。
验证某个 profile 的 AK 实际生效
# 应该返回 profile 里配的 AK 而不是环境变量里那把
ossutil config get accessKeyID --profile=cogview-data
# LTAI5tG2Fy8nYY5QXN85BxWk
# 实际访问测试(应该列出对象)
ossutil ls oss://cogview-data/ --profile=cogview-data --limited-num=2其他注意事项
- ossutil 2.x 默认 sign-version v4,必须配 region;profile 里都已配好
- 本机只能直连北京 OSS 内网 endpoint,乌兰察布 内/外网 endpoint 都超时不通
- 没有
oss:ListBucketsservice 级权限,所以ossutil ls(不带桶名)会返回 403;要列桶就只能针对具体桶名 - 配置文件改动后无需重启,下次
ossutil调用直接生效