AWS CLI上传文件至S3时对象键出现多余字符的问题咨询
问题:AWS S3上传文件后对象键出现多余字符,导致「Key not found」错误
我使用以下Shell脚本将文件上传至AWS S3存储桶:
#!/bin/sh export AWS_ACCESS_KEY_ID="$KEY_ID" export AWS_SECRET_ACCESS_KEY="$KEY_SECRET" echo "[INFO] AWS_ACCESS_KEY_ID - $AWS_ACCESS_KEY_ID" echo "[INFO] AWS_SECRET_ACCESS_KEY - $AWS_SECRET_ACCESS_KEY" S3_URL="s3://mybucket/uploads" aws s3 cp ../data.pdf $S3_URL/data.pdf aws s3 cp ../data.html.zip $S3_URL/data.html.zip echo "[INFO] Uploaded Successfully" echo ""
执行脚本后文件成功上传,但在S3浏览器UI中发现对象键名称末尾出现了多余字符,这导致我的下载服务无法读取文件,出现「Key not found」错误。请问这些字符为何自动出现?如何消除该问题?
解答
我来帮你排查这个问题——S3对象键出现肉眼不可见的多余字符,通常是由隐藏字符、脚本格式或变量取值问题导致的,下面是最常见的原因和对应的解决办法:
1. 脚本使用了Windows换行符(CRLF)
如果你的脚本是在Windows系统下编辑的,然后放到Linux/macOS环境运行,脚本里的换行符会是CRLF(\r\n)而非Unix系统的LF(\n)。执行脚本时,\r字符(终端显示为^M)会被当作命令的一部分附加到文件名末尾,导致S3上的对象键变成data.pdf^M这类形式——肉眼看不到,但实际会让你的下载服务找不到对应键。
解决办法:
- 用
dos2unix工具转换脚本格式:dos2unix your-upload-script.sh - 或者在编辑器(比如VS Code)中,将文件的换行符设置为
LF(编辑器右下角通常可以切换换行符格式),保存后重新运行脚本。
2. 环境变量或变量值包含隐藏空格/换行符
如果$KEY_ID、$KEY_SECRET或者S3_URL这些变量的取值里带有空格、换行符这类隐藏字符,拼接S3路径时就会引入多余内容。比如S3_URL定义时末尾不小心加了空格,或者从配置文件读取环境变量时带了换行。
解决办法:
- 在脚本中添加一行打印变量的代码(用单引号包裹,能显式显示空格或换行):
执行脚本后查看输出,确认变量是否有多余字符。echo "S3_URL原始值: '$S3_URL'" - 检查环境变量的来源(比如
.env文件、命令行输入),确保取值没有额外的空格或换行。
3. 本地文件名本身带有隐藏字符
有可能你本地的data.pdf或data.html.zip文件名末尾实际带有空格、不可见ASCII字符,上传时这些字符会被同步到S3的对象键中。
解决办法:
- 在本地终端用
ls -b命令查看文件名的原始形式(-b参数会把不可见字符显示为转义序列):
如果发现有多余字符,重命名文件去掉这些内容后重新上传。ls -b ../data.pdf
4. 验证最终执行的AWS命令
如果上面的方法还没找到问题,可以在脚本中临时添加一行,打印出实际执行的AWS命令,这样能直观看到是否有多余字符:
echo "执行的上传命令:aws s3 cp ../data.pdf $S3_URL/data.pdf"
执行脚本后看输出的命令是否异常,就能快速定位问题所在。
内容的提问来源于stack exchange,提问作者divinedragon
相关产品推荐
相关产品推荐

