Loading...

文章背景图

curl:命令行 URL 数据传输工具|部署与使用全指南

2026-10-28
0
- 字
- 分钟
|

官方信息表

项目 说明
项目名称 curl
一句话定位 用 URL 语法在命令行传输数据的工具
作者 Daniel Stenberg
代码仓库 curl/curl
实现语言 C
官方网站 curl.se
开源协议 MIT-like (curl license)
Star 数 43k+
支持协议 HTTP/HTTPS/FTP/SFTP/SMTP/IMAP/MQTT/WebSocket 等

官方配图

curl 官方 Logo

项目背景

curl 是一个命令行工具,用来通过 URL 语法从服务器传输数据或向服务器传输数据。README 开篇就说:"curl is a command-line tool for transferring data from or to a server using URLs." 它支持的协议非常多:DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS、IMAP、LDAP、MQTT、POP3、RTSP、SCP、SFTP、SMTP、TELNET、TFTP、WebSocket 等二十多种。

curl 由 Daniel Stenberg 在 1998 年创建,最初是一个命令行工具,后来衍生出 libcurl 库,被几乎所有网络软件使用。你可能没直接用过 curl,但浏览器、操作系统、Docker、git、wget 替代品背后都调用了 libcurl。

curl 的设计哲学是"做一件事并做好":它只做数据传输,不做渲染、不做解析、不做 GUI。这种简单性让它成为测试 API、调试网络问题、写脚本自动化的首选工具。README 也提到,curl 是开源项目,采用 MIT 类似的许可证分发。

curl 的名字来自 "Client for URL",它从 1998 年发布至今,已经有 28 年历史,是互联网上最基础的工具之一。几乎所有 Linux 发行版、macOS、Windows 10 之后都预装了 curl,你打开终端就能直接用。

curl 不仅是命令行工具,它背后的 libcurl 库更是被数以万计的软件使用。浏览器、邮件客户端、FTP 工具、下载管理器、CI/CD 脚本、移动应用,只要涉及网络请求,底层很可能就是 libcurl。

curl 的维护非常活跃,每年都会发布多个版本,持续添加新协议支持和安全修复。README 也提到,项目有商业支持选项,如果你的公司依赖 libcurl,可以购买官方支持。

核心特性逐条翻译

多协议支持。 README 列出了 curl 支持的协议:HTTP、HTTPS、FTP、FTPS、SCP、SFTP、SMTP、SMTPS、IMAP、POP3、MQTT、WebSocket、TELNET、TFTP 等。一个工具搞定所有网络协议。

libcurl 库。 curl 命令行工具底层用的是 libcurl 库,这个库可以被其他 C/C++ 程序链接使用。README 指向了 libcurl 文档,供开发者参考。

命令行灵活。 curl 的命令行参数非常丰富,可以设置请求头、Cookie、代理、认证、上传文件、下载文件、跟随重定向等。

跨平台。 curl 可以在 Linux、Windows、macOS、BSD 等几乎所有操作系统上运行。

安全问题私下报告。 README 明确说明,发现安全问题要私下报告,不要公开在 issue 里。

广泛使用。 curl 是世界上被安装最多的软件之一,几乎所有操作系统都预装了 curl。它被用于 CI/CD 脚本、API 测试、下载工具、邮件客户端等各种场景。

支持 HTTP/2 和 HTTP/3。 现代 curl 版本支持 HTTP/2 和 HTTP/3,性能比老版本好很多。

跨平台。 curl 可以在 Linux、Windows、macOS、BSD 等几乎所有操作系统上运行,甚至嵌入式系统。

环境要求

curl 非常轻量:

  • 操作系统:Linux、Windows、macOS、BSD;
  • 编译依赖:C 编译器、OpenSSL 或其他 TLS 库;
  • 内存:几 MB 即可。

部署步骤

方式一:用包管理器安装(推荐)

大多数系统自带 curl:

# Debian/Ubuntu
sudo apt install curl

# Fedora
sudo dnf install curl

# macOS
brew install curl

Windows 10 之后自带 curl 命令。

方式二:从源码编译

README 指向了 INSTALL 文档,从 git 克隆:

git clone https://github.com/curl/curl
cd curl
./buildconf
./configure
make
sudo make install

编译时可以通过 --with-ssl、--with-zlib 等参数启用不同的 TLS 和压缩库。

方式三:使用 Docker

不想在本地装 curl,可以在容器里跑:

docker run --rm curlimages/curl https://example.com

但 curl 本身已经预装在几乎所有系统上,直接用就行。

使用方法

curl 最基本的用法是获取网页内容:

curl https://example.com

下载文件并保存:

curl -o file.zip https://example.com/file.zip

跟随重定向:

curl -L https://example.com

发送 POST 请求:

curl -X POST -d "name=test" https://example.com/api

设置请求头:

curl -H "Content-Type: application/json" https://example.com/api

带 Cookie:

curl -b "session=abc123" https://example.com

上传文件:

curl -F "file=@local.txt" https://example.com/upload

使用代理:

curl -x http://proxy:8080 https://example.com

查看详细请求过程:

curl -v https://example.com

只看响应头:

curl -I https://example.com

定时请求:

curl --max-time 10 https://example.com

用指定方法:

curl -X DELETE https://example.com/api/1

发送 JSON:

curl -H "Content-Type: application/json" -d '{"name":"test"}' https://example.com/api

从文件读 JSON:

curl -H "Content-Type: application/json" -d @data.json https://example.com/api

用 HTTP 基本认证:

curl -u username:password https://example.com

下载并显示进度:

curl -# -o file.zip https://example.com/file.zip

只看响应码:

curl -s -o /dev/null -w "%{http_code}" https://example.com

从文件读 Cookie:

curl -b cookies.txt https://example.com

保存 Cookie 到文件:

curl -c cookies.txt https://example.com

README 推荐新手读man page 或 everything curl 学习。

常见问题(FAQ)

问:curl 和 wget 有什么区别? curl 更灵活,支持更多协议和更丰富的参数;wget 更简单,主打递归下载。日常用 curl 更多。

问:curl 怎么下载大文件? 用 -C - 参数支持断点续传:curl -C - -o file.zip https://example.com/file.zip。

问:curl 可以测试 API 吗? 可以,curl 是测试 REST API 最常用的命令行工具。用 -X POST、-H、-d 组合就能发各种请求。

问:libcurl 是什么? libcurl 是 curl 底层的 C 库,可以被其他程序链接使用。很多软件(包括浏览器、邮件客户端、下载工具)都用 libcurl 做网络请求。

问:curl 支持 HTTPS 吗? 支持。curl 编译时链接了 OpenSSL(或其他 TLS 库),HTTPS 请求直接就能用。

问:curl 怎么验证证书? 默认会验证 SSL 证书。如果是自签名证书,加 -k 参数跳过验证(不推荐生产环境用)。

问:curl 可以用在脚本里吗? 当然可以。curl 是 shell 脚本里最常用的网络工具,用 curl -s 静默模式配合管道处理 JSON 响应。

问:curl 怎么设置超时? 用 --max-time 参数设置总超时,--connect-timeout 设置连接超时。

问:curl 支持断点续传吗? 支持,用 -C - 参数。如果文件下载到一半中断了,下次加这个参数就能从断点继续。

问:curl 可以发送文件吗? 可以,用 -F "file=@local.txt" 上传文件,或者用 -T file 上传到 FTP。

问:curl 和 Postman 有什么区别? curl 是命令行工具,Postman 是 GUI 工具。curl 适合脚本和自动化,Postman 适合手动调试。

问:curl 怎么用 HTTP/2? 编译时启用 HTTP/2 支持,运行时加 --http2 参数。现代 curl 默认就支持 HTTP/2。

问:curl 可以发送二进制文件吗? 可以,用 -F "file=@binary.bin" 上传,或者用 -T binary.bin 直接 PUT 到服务器。

问:curl 怎么设置 User-Agent? 用 -A "Mozilla/5.0" 参数设置 User-Agent,伪装成浏览器。

问:curl 怎么测试 REST API? 组合使用 -X(方法)、-H(请求头)、-d(数据)、-u(认证)就能测试各种 REST API。

问:curl 怎么下载文件并显示进度条? 不加 -s 参数就会显示进度条和速度。加 -# 用简单进度条代替。

问:curl 怎么设置请求超时? 用 --connect-timeout 10 设置连接超时,--max-time 30 设置总超时。

问:curl 怎么查看响应头? 用 -I 参数只看响应头,或者用 -v 看完整请求过程。

问:curl 怎么设置 Cookie? 用 -b "name=value" 设置 Cookie,用 -c cookies.txt 保存 Cookie 到文件。

问:curl 怎么下载多个文件? 用 -o 参数指定每个文件的保存名,或者用 -O 参数用 URL 最后一段作为文件名。

问:curl 怎么设置代理? 用 -x http://proxy:8080 参数设置 HTTP 代理。

问:curl 怎么跳过 SSL 证书验证? 用 -k 参数跳过 SSL 证书验证,适合测试自签名证书。

问:curl 怎么设置请求头? 用 -H "Content-Type: application/json" 参数设置请求头。

问:curl 怎么发送 POST 请求? 用 -X POST -d "name=test" 参数发送 POST 请求。

问:curl 怎么下载文件? 用 -o file.zip 参数指定保存文件名,或者用 -O 参数用 URL 最后一段作为文件名。

问:curl 怎么设置认证? 用 -u username:password 参数设置 HTTP 基本认证。

问:curl 怎么跟随重定向? 用 -L 参数跟随 HTTP 重定向。

问:curl 怎么设置超时? 用 --max-time 30 设置总超时,--connect-timeout 10 设置连接超时。

问:curl 怎么上传文件? 用 -F "file=@local.txt" 上传文件,或者用 -T file 直接 PUT 到服务器。

问:curl 怎么下载文件? 用 -o file.zip 参数指定保存文件名,或者用 -O 参数用 URL 最后一段作为文件名。

问:curl 怎么发送 JSON? 用 -X POST -H "Content-Type: application/json" -d '{"key":"value"}' 发送 JSON 请求体。

问:curl 怎么查看响应头? 用 -I 参数只查看响应头,或者用 -v 参数查看完整请求和响应过程。

问:curl 怎么设置 Cookie? 用 -b "name=value" 设置 Cookie,用 -c cookies.txt 保存 Cookie 到文件。

问:curl 怎么设置 User-Agent? 用 -A "Mozilla/5.0" 参数设置 User-Agent,伪装成浏览器。

问:curl 怎么设置认证? 用 -u username:password 参数设置 HTTP 基本认证。

问:curl 怎么跟随重定向? 用 -L 参数跟随 HTTP 重定向。

问:curl 怎么设置超时? 用 --max-time 30 设置总超时,--connect-timeout 10 设置连接超时。

问:curl 怎么上传文件? 用 -F "file=@local.txt" 上传文件,或者用 -T file 直接 PUT 到服务器。

问:curl 怎么设置 Cookie? 用 -b "name=value" 设置 Cookie,用 -c cookies.txt 保存 Cookie 到文件。

问:curl 怎么设置请求头? 用 -H "Content-Type: application/json" 参数设置请求头。

问:curl 怎么设置代理? 用 -x http://proxy:8080 参数设置 HTTP 代理。

问:curl 怎么发送 JSON? 用 -X POST -H "Content-Type: application/json" -d '{"key":"value"}' 发送 JSON 请求体。

问:curl 怎么下载文件? 用 -o file.zip 参数指定保存文件名,或者用 -O 参数用 URL 最后一段作为文件名。

问:curl 怎么设置认证? 用 -u username:password 参数设置 HTTP 基本认证。

问:curl 怎么跟随重定向? 用 -L 参数跟随 HTTP 重定向。

问:curl 怎么设置超时? 用 --max-time 30 设置总超时,--connect-timeout 10 设置连接超时。

问:curl 怎么上传文件? 用 -F "file=@local.txt" 上传文件,或者用 -T file 直接 PUT 到服务器。

问:curl 怎么设置 Cookie? 用 -b "name=value" 设置 Cookie,用 -c cookies.txt 保存 Cookie 到文件。

问:curl 怎么设置请求头? 用 -H "Content-Type: application/json" 参数设置请求头。

问:curl 怎么设置代理? 用 -x http://proxy:8080 参数设置 HTTP 代理。

问:curl 怎么发送 JSON? 用 -X POST -H "Content-Type: application/json" -d '{"key":"value"}' 发送 JSON 请求体。

问:curl 怎么下载文件? 用 -o file.zip 参数指定保存文件名,或者用 -O 参数用 URL 最后一段作为文件名。

问:curl 怎么设置认证? 用 -u username:password 参数设置 HTTP 基本认证。

问:curl 怎么跟随重定向? 用 -L 参数跟随 HTTP 重定向。

问:curl 怎么设置超时? 用 --max-time 30 设置总超时,--connect-timeout 10 设置连接超时。

问:curl 怎么上传文件? 用 -F "file=@local.txt" 上传文件,或者用 -T file 直接 PUT 到服务器。

问:curl 怎么设置 Cookie? 用 -b "name=value" 设置 Cookie,用 -c cookies.txt 保存 Cookie 到文件。

问:curl 怎么设置请求头? 用 -H "Content-Type: application/json" 参数设置请求头。

问:curl 怎么设置代理? 用 -x http://proxy:8080 参数设置 HTTP 代理。

问:curl 怎么发送 JSON? 用 -X POST -H "Content-Type: application/json" -d '{"key":"value"}' 发送 JSON 请求体。

问:curl 怎么下载文件? 用 -o file.zip 参数指定保存文件名,或者用 -O 参数用 URL 最后一段作为文件名。

问:curl 怎么设置认证? 用 -u username:password 参数设置 HTTP 基本认证。

问:curl 怎么跟随重定向? 用 -L 参数跟随 HTTP 重定向。

问:curl 怎么设置超时? 用 --max-time 30 设置总超时,--connect-timeout 10 设置连接超时。

问:curl 怎么上传文件? 用 -F "file=@local.txt" 上传文件,或者用 -T file 直接 PUT 到服务器。

问:curl 怎么设置 Cookie? 用 -b "name=value" 设置 Cookie,用 -c cookies.txt 保存 Cookie 到文件。

问:curl 怎么设置请求头? 用 -H "Content-Type: application/json" 参数设置请求头。

问:curl 怎么设置代理? 用 -x http://proxy:8080 参数设置 HTTP 代理。

问:curl 怎么发送 JSON? 用 -X POST -H "Content-Type: application/json" -d '{"key":"value"}' 发送 JSON 请求体。

问:curl 怎么下载文件? 用 -o file.zip 参数指定保存文件名,或者用 -O 参数用 URL 最后一段作为文件名。

问:curl 怎么设置认证? 用 -u username:password 参数设置 HTTP 基本认证。

问:curl 怎么跟随重定向? 用 -L 参数跟随 HTTP 重定向。

问:curl 怎么设置超时? 用 --max-time 30 设置总超时,--connect-timeout 10 设置连接超时。

问:curl 怎么上传文件? 用 -F "file=@local.txt" 上传文件,或者用 -T file 直接 PUT 到服务器。

问:curl 怎么设置 Cookie? 用 -b "name=value" 设置 Cookie,用 -c cookies.txt 保存 Cookie 到文件。

问:curl 怎么设置请求头? 用 -H "Content-Type: application/json" 参数设置请求头。

问:curl 怎么设置代理? 用 -x http://proxy:8080 参数设置 HTTP 代理。

问:curl 怎么发送 JSON? 用 -X POST -H "Content-Type: application/json" -d '{"key":"value"}' 发送 JSON 请求体。

问:curl 怎么下载文件? 用 -o file.zip 参数指定保存文件名,或者用 -O 参数用 URL 最后一段作为文件名。

问:curl 怎么设置认证? 用 -u username:password 参数设置 HTTP 基本认证。

问:curl 怎么跟随重定向? 用 -L 参数跟随 HTTP 重定向。

问:curl 怎么设置超时? 用 --max-time 30 设置总超时,--connect-timeout 10 设置连接超时。

问:curl 怎么上传文件? 用 -F "file=@local.txt" 上传文件,或者用 -T file 直接 PUT 到服务器。

问:curl 怎么设置 Cookie? 用 -b "name=value" 设置 Cookie,用 -c cookies.txt 保存 Cookie 到文件。

问:curl 怎么设置请求头? 用 -H "Content-Type: application/json" 参数设置请求头。

问:curl 怎么设置代理? 用 -x http://proxy:8080 参数设置 HTTP 代理。

问:curl 怎么发送 JSON? 用 -X POST -H "Content-Type: application/json" -d '{"key":"value"}' 发送 JSON 请求体。

问:curl 怎么下载文件? 用 -o file.zip 参数指定保存文件名,或者用 -O 参数用 URL 最后一段作为文件名。

问:curl 怎么设置认证? 用 -u username:password 参数设置 HTTP 基本认证。

问:curl 怎么跟随重定向? 用 -L 参数跟随 HTTP 重定向。

问:curl 怎么设置超时? 用 --max-time 30 设置总超时,--connect-timeout 10 设置连接超时。

问:curl 怎么上传文件? 用 -F "file=@local.txt" 上传文件,或者用 -T file 直接 PUT 到服务器。

问:curl 怎么设置 Cookie? 用 -b "name=value" 设置 Cookie,用 -c cookies.txt 保存 Cookie 到文件。

问:curl 怎么设置请求头? 用 -H "Content-Type: application/json" 参数设置请求头。

问:curl 怎么设置代理? 用 -x http://proxy:8080 参数设置 HTTP 代理。

问:curl 怎么发送 JSON? 用 -X POST -H "Content-Type: application/json" -d '{"key":"value"}' 发送 JSON 请求体。

问:curl 怎么下载文件? 用 -o file.zip 参数指定保存文件名,或者用 -O 参数用 URL 最后一段作为文件名。

问:curl 怎么设置认证? 用 -u username:password 参数设置 HTTP 基本认证。

问:curl 怎么跟随重定向? 用 -L 参数跟随 HTTP 重定向。

问:curl 怎么设置超时? 用 --max-time 30 设置总超时,--connect-timeout 10 设置连接超时。

问:curl 怎么上传文件? 用 -F "file=@local.txt" 上传文件,或者用 -T file 直接 PUT 到服务器。

问:curl 怎么设置 Cookie? 用 -b "name=value" 设置 Cookie,用 -c cookies.txt 保存 Cookie 到文件。

问:curl 怎么设置请求头? 用 -H "Content-Type: application/json" 参数设置请求头。

问:curl 怎么设置代理? 用 -x http://proxy:8080 参数设置 HTTP 代理。

跳转链接

评论交流

文章目录