Linux shell编程学习条记69: curl 命令行网络数据传输工具 选项数目雷人(

[复制链接]
发表于 2026-10-3 22:50:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

curl 是 Linux 里一款全能的网络传输工具,既能上传也能下载,支持 HTTP、HTTPS、FTP 等三十余种常见协议。它的选项多到令人发指,这篇用实例挑几个最常用的场景讲清楚:跟随重定向、断点续传、走代理、伪装 User-Agent,以及进度与限速控制。

一、跟随重定向:-L

访问一个已经搬走的网页时,服务端会返回一个 HTTP Location 响应头,把请求重定向到新地址。curl 默认不会跟随重定向,这时结果里只会看到一行 301 Moved。

$ curl g.cn

301 Moved
301 Moved
The document has moved
here.

加上 -L 就会自动跳到最终地址,返回真正的内容:

$ curl -L g.cn

二、断点续传:-C - 与 -O

Windows 下大家习惯用迅雷断点续传,Linux 里 curl 的 -C 就是干这个的。

1. 先下断

$ curl -O https://dldir1.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.12_240808_amd64_01.deb
%Total    %Received   %Xferd   AverageSpeed   Time   Time   Time  Current
Dload  Upload  Total  Spent  Left  Speed
13145M  1319.0M  006154k  00:00:24  0:00:03  0:00:21  6153k^C

下到 19% 时按 Ctrl+C 打断,用 du 看文件只有 22528 字节。

2. 接着续

$ curl -C - -O https://dldir1.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.12_240808_amd64_01.deb

** Resuming transfer from byte position 23068672

它会打印一个续传起点字节数,续完再用 du 看,文件大小已经回到 148708 字节。

要点:-O 让 curl 用远程文件名保存到当前目录;-C - 中的短横线表示“从上次的断点继续”,写成具体字节数则从头算偏移。大文件下载脚本里这两个基本是标配。

三、指定代理:-x

curl 提供 -x 选项来设置代理,格式是 -x 代理服务器地址:端口。代理通不通,报错信息一眼就能看出来:

$ curl -x 127.0.0.1:1080 http://g.cn
curl: (7) Failed connect to 127.0.0.1:1080; Connection refused

连不上会直接给出连接被拒,说明代理进程没起或者端口写错,比连到目标地址超时要容易定位得多。

四、伪装浏览器:-A

有些站点只对特定浏览器或特定版本放行,curl 的 -A 可以指定 User-Agent。

$ curl https://www.csdn.net | more
  0     0     0     0     0     0      0      0 --:--:-- --:--:-- --:--:--     0
CSDN-专业开发者社区

配合 -A "Mozilla/5.0 ..." 就能伪装成常见浏览器。注意访问自建或内部服务时要有合规意识,别拿这个去撞不应该撞的接口。

五、安静模式、进度与输出控制

  • -s 安静模式:不输出进度条和错误信息,适合写进脚本。
  • -S 与 -s 搭配:出错时仍然打印错误信息。
  • -f 失败不输出:服务端返回 404/500 时不返回响应体,返回非零码。
  • -o 文件名 指定输出文件,不像 -O 那样必须用远程文件名。
  • -I 只取响应头,用来探活或看 Content-Type。
  • -w "%{http_code}" 自定义输出,比如只要状态码,shell 里判断很方便。
  • --limit-rate 1M 限速,后台传大文件不至于把带宽占满。
# 写脚本时最常见的组合
curl -sS -f -o /tmp/app.tar.gz --limit-rate 2M https://example.com/app.tar.gz || echo "download failed"

六、几个实用组合

# 探活并拿状态码
code=$(curl -s -o /dev/null -w "%{http_code}" -k https://example.com/health)

# 只看响应头
curl -I https://example.com/api/status

# 带表单提交
curl -X POST -d "name=test" https://example.com/api/submit

# 只取某几秒的限速下载
curl -C - -O --limit-rate 500k https://example.com/big.iso

七、小结

  • 重定向用 -L;断点续传用 -C - 配 -O。
  • 代理用 -x 地址:端口,连接被拒基本是代理本身的问题。
  • 伪装 UA 用 -A,抓取前先看站点规则。
  • 脚本里推荐 -sSf 三件套加 -o,错误可见又不会混进垃圾输出。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表