ossutil 多账号使用指南

2026-06-11 整理。配置文件位于 /workspace/ckpt_downstream/zzm/myApp/ossutilconfig,已通过软链接挂到 /root/.ossutilconfig,并由 /root/.bashrc 末尾的钩子保证软链接始终存在。

配置概览

一份 ossutil 配置文件里有三个 profile:

profileendpoint拥有的桶备注
cogview-dataoss-cn-beijing-internal.aliyuncs.comoss://cogview-data/北京内网,本机可达
mm-group-imageoss-cn-beijing-internal.aliyuncs.comoss://mm-group-image/北京内网,本机可达
defaultoss-cn-wulanchabu-internal.aliyuncs.com(未知,无权限测)乌兰察布内网,本机网络不可达,日常忽略

cogview-datamm-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 包裹时 —— 函数不生效,要用下面的「脚本里调用」方式

脚本里调用

timeoutbash -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

其他注意事项

  1. ossutil 2.x 默认 sign-version v4,必须配 region;profile 里都已配好
  2. 本机只能直连北京 OSS 内网 endpoint,乌兰察布 内/外网 endpoint 都超时不通
  3. 没有 oss:ListBuckets service 级权限,所以 ossutil ls(不带桶名)会返回 403;要列桶就只能针对具体桶名
  4. 配置文件改动后无需重启,下次 ossutil 调用直接生效