wget 适合断点续传和批量下载,curl 更适合 http 请求定制;二者语义不同,混用易引发 range 失效、content-type 缺失、证书校验差异等问题。

别用 wget 做 HTTP POST,也别用 curl 当下载管理器——它们底层设计目标不同,硬套会导致断点失败、重定向丢失、cookie 无法复用等隐性问题。
什么时候该用 wget -c 而不是 curl -C -
断点续传场景下,wget -c 更可靠,因为它会主动检查本地文件大小、发送 Range 请求,并兼容绝大多数 Web 服务器的 206 Partial Content 响应。而 curl -C - 依赖服务端正确返回 Accept-Ranges: bytes 头,且遇到 302 重定向时默认不携带 Range,容易从头下载。
-
wget -c https://example.com/large.zip:自动判断是否可续传,失败后重试三次(默认) -
curl -C - -o large.zip https://example.com/large.zip:若服务器没返回Content-Range或重定向跳转,会覆盖已有文件 - 如果下载中途被 kill,
wget会保留不完整文件;curl默认不保留,需加--create-dirs和手动检查
curl -d 和 wget --post-data 发送表单的区别
两者都支持 POST,但语义和默认行为不同:curl -d 默认设 Content-Type: application/x-www-form-urlencoded,而 wget --post-data 不设任何 Content-Type 头,必须手动加 --header="Content-Type: ...",否则某些后端(如 Flask、Django)会解析失败。
-
curl -d "user=admin&pass=123" https://api.example.com/login:能被大多数 PHP/Node 后端直接读取$_POST或req.body -
wget --post-data="user=admin&pass=123" --header="Content-Type: application/x-www-form-urlencoded" https://api.example.com/login:缺--header就可能收不到参数 - 上传 JSON 时,
curl更简洁:curl -H "Content-Type: application/json" -d '{"key":"val"}' URL;wget需配合临时文件或--body-file
绕过证书验证的两种写法及其风险差异
wget --no-check-certificate 和 curl -k 都禁用 TLS 证书校验,但影响范围不同:wget 仅跳过 HTTPS 站点的证书链验证;curl -k 还会忽略客户端证书错误、SNI 不匹配、甚至自签名 CA 错误——在调试内网服务时更“彻底”,但也更容易掩盖真实配置问题。
- 生产环境严禁使用这两个参数,哪怕只是临时测试
- 若需信任私有 CA,
wget应配--ca-certificate=/path/to/ca.crt;curl用--cacert /path/to/ca.crt -
curl -k在遇到SSL certificate problem: self signed certificate in certificate chain时静默通过;wget同样报错但提示更明确
批量下载多个 URL 时的输入格式陷阱
wget -i urls.txt 要求每行一个 URL,且不能有空格、注释或空行;curl 没有原生批量模式,必须用 shell 循环或 xargs,否则容易因 URL 编码或特殊字符(如 &、?)出错。
-
wget -i urls.txt -P ./downloads:urls.txt中的https://a.com/file?x=1&y=2会被当作两个参数,应写成https://a.com/file?x=1&y=2(注意 & 前不加反斜杠) -
cat urls.txt | xargs -n1 curl -O:若 URL 含空格或引号,会解析失败;稳妥做法是while IFS= read -r url; do curl -O "$url"; done -
wget支持-A "*.pdf" -R "index.html"过滤文件类型;curl需靠外部工具(如grep)预处理 URL 列表
最常被忽略的是重定向处理:wget 默认跟随 3xx,curl 默认不跟;要用 curl -L 才等效。但 -L 会丢弃原始请求方法(比如 POST 变 GET),而 wget 的 --method=POST 配合 -L 才真正安全。











