curl 下载文件乱码问题
问题场景
当你使用 curl
命令下载 CSV 等数据文件时,可能会遇到下载的文件在 Excel 中打开显示乱码或包含未知字符的情况,而通过浏览器直接下载却可以正常打开。
问题原因
根本问题在于 URL 中包含特殊字符 &
:
bash
curl --output /home/../test2.csv https://example.com/xxx/download?path=yyy&files=zzz.csv
在 Shell 环境中,&
符号有特殊含义——它会将当前命令放入后台运行,并立即执行后续命令。这会导致:
curl
实际只获取了&
符号前的 URL 片段:https://example.com/xxx/download?path=yyy
- 服务器接收到不完整的请求,返回错误页面或部分内容
files=zzz.csv
部分被 Shell 解释为独立命令- 最终下载的文件不是目标 CSV,而是错误响应或截断内容
解决方案
方法:使用引号包裹 URL(推荐)
bash
# 双引号方案(支持变量扩展)
curl --output test.csv "https://example.com/xxx/download?path=yyy&files=zzz.csv"
# 单引号方案(更安全,防变量误解析)
curl --output test.csv 'https://example.com/xxx/download?path=yyy&files=zzz.csv'
关键说明:
- 引号强制 Shell 将整个 URL 识别为单一参数
- 所有特殊字符(
&
,?
,;
等)会被保留原义 - 使用实际 URL 替换示例链接
对于提问中的具体案例:
bash
curl --output /home/../test2.csv "https://cloudstor.aarnet.edu.au/plus/s/2DhnLGDdEECo4ys/download?path=%2FUNSW-NB15%20-%20CSV%20Files&files=UNSW-NB15_1.csv"
防御性编程技巧
- 始终封装原则:即使 URL 当前不含特殊字符,也建议始终添加引号
- 优先单引号:当 URL 含
$
符号等需防误解析时(如:file=$name.csv
),使用单引号更安全 - 复制可靠性:从浏览器地址栏复制 URL 时,确保完整复制(右键→复制链接地址)
验证下载完整性
执行成功后,可通过以下命令验证:
bash
# 查看文件类型
file test.csv
# 检查CSV文件头部内容
head -n 3 test.csv
预期出现类似结果(而非HTML内容):
"id","duration","protocol",...
1,0,"tcp",...
2,0,"udp",...
扩展知识:其他相关故障排除
案例1:跟随重定向
bash
# 添加 -L 参数跟踪重定向
curl -L -o filename.csv "原始URL含特殊字符"
案例2:处理SSL证书异常
bash
# 忽略SSL校验(仅用于测试环境)
curl -k -o file.csv "https://..."
# 指定自定义证书
curl --cacert /path/to/cert.pem -o file.csv "https://..."
案例3:大文件断点续传
bash
# 支持断点续传
curl -C - -o largefile.zip "下载URL"