You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS凭证在配置文件可用但环境变量不可用问题排查

问题

直接执行aws s3 ls可正常运行,但运行以下bash脚本时出现签名不匹配错误:

#! /usr/bin/env bash
env_vars=$(cat ~/.aws/credentials | tail -n +2 | sed -e 's/ *//g' | tr 'a-z' 'A-Z' | tr '\n' ' ')
echo ${env_vars}

env ${env_vars} aws s3 ls

错误信息:

An error occurred (SignatureDoesNotMatch) when calling the ListBuckets operation: The request signature we calculated does not match the signature you provided. Check your key and signing method.

已确认凭证完全一致,添加--region us-west-2参数也无法解决问题。

原因与解决方法
  • 环境变量传递格式错误:你的脚本将~/.aws/credentials内容转大写后直接用空格拼接成字符串,再通过env ${env_vars}传递时,bash会对字符串进行分词拆分,导致AWS所需的环境变量(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY)没有被正确识别为键值对。比如原文件的键值对经过处理后变成AWS_ACCESS_KEY_ID=AKIAXXX AWS_SECRET_ACCESS_KEY=abc123,但env命令无法正确解析这种空格分隔的字符串为有效环境变量。

  • 特殊字符处理隐患:如果凭证密钥包含空格、&等特殊字符,原脚本的字符串拼接方式会直接破坏密钥完整性,进一步导致签名验证失败。

  • 修正后的脚本示例:

    #! /usr/bin/env bash
    # 逐行读取credentials文件(跳过第一行配置段头),处理后导出为环境变量
    while IFS='=' read -r raw_key raw_value; do
        # 清除键值两端空格并将键名转大写
        key=$(echo "$raw_key" | sed 's/^ *//;s/ *$//' | tr 'a-z' 'A-Z')
        value=$(echo "$raw_value" | sed 's/^ *//;s/ *$//')
        export "$key=$value"
    done < <(tail -n +2 ~/.aws/credentials)
    
    aws s3 ls
    

    该脚本通过逐行读取并导出环境变量的方式,确保键值对被正确识别,同时避免了特殊字符的拆分问题。

内容的提问来源于stack exchange,提问作者Foobar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:15:21