命令行利器 curl:基本用法与示例
在日常的开发、测试、网络故障排查以及系统管理工作中,我们经常需要与网络资源进行交互,例如发送 HTTP 请求、下载文件、上传数据等等。图形界面浏览器固然强大,但在自动化脚本、无头环境或者需要精细控制请求细节的场景下,一款强大的命令行工具就显得尤为重要。curl
正是这样一款久负盛名的工具。
curl
是一个利用 URL 语法在命令行下工作的开源工具,可以用来传输数据。它支持多种协议,包括 DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet 和 TFTP。它的设计目标是无用户交互。
虽然 curl
功能极其强大,涵盖了各种高级网络操作,但对于大多数用户而言,掌握其基本用法就能应对绝大部分日常需求。本文将聚焦于 curl
的基础知识,详细介绍其核心功能、常用选项以及通过丰富的示例帮助读者快速上手并深入理解。
1. curl 是什么?为什么使用它?
curl (Client for URLs) 是一个命令行程序库(libcurl)及其对应的命令行工具。它通过 URL 来传输数据。
为什么使用 curl?
- 通用性强: 支持大量网络协议,几乎可以处理你能想到的所有与网络传输相关的任务。
- 跨平台: 在几乎所有主流操作系统(Linux, macOS, Windows)上都可以使用,且行为一致。
- 无图形界面: 极适合用于脚本自动化、批量处理、服务器环境操作。
- 功能强大且灵活: 可以精细控制请求的各个方面,如方法、头部、数据、认证、代理、超时等。
- 排查网络问题: 是诊断 HTTP/HTTPS 请求、查看响应头、调试 API 的利器。
- 下载/上传: 可以方便地从网络下载文件,或者向服务器上传数据。
总之,curl
是一个网络交互的瑞士军刀,掌握它能极大地提高工作效率。
2. 安装 curl
在绝大多数现代操作系统中,curl
都已经预装。你可以在终端中输入以下命令来检查是否安装以及查看版本:
bash
curl --version
如果命令执行成功并显示版本信息,说明你已经拥有 curl
。
如果未安装,可以通过各平台的包管理器进行安装:
- Debian/Ubuntu:
sudo apt update && sudo apt install curl
- RHEL/CentOS/Fedora:
sudo yum install curl
或sudo dnf install curl
- macOS (使用 Homebrew):
brew install curl
(通常已预装,但如果需要更新版本,可以使用 Homebrew) - Windows: 可以从 curl 官网 下载安装包,或者使用包管理器如 Chocolatey (
choco install curl
)。
安装完成后,就可以开始使用了。
3. curl 的基本用法
curl
最基本的用法就是直接跟上一个 URL:
bash
curl <URL>
例如:
bash
curl https://www.example.com
这条命令会向 https://www.example.com
发送一个 GET 请求(GET 是默认的 HTTP 方法),并将服务器返回的响应体(通常是 HTML 内容)输出到标准输出(你的终端)。
示例 3.1:获取一个网页的HTML内容
bash
curl https://www.baidu.com
执行此命令,你将在终端看到百度首页的 HTML 源代码。
4. HTTP 请求方法
curl
默认发送的是 GET
请求。但 HTTP 协议定义了多种请求方法,如 POST
, PUT
, DELETE
, HEAD
, OPTIONS
等。你可以使用 -X
或 --request
选项来指定使用的 HTTP 方法。
bash
curl -X <METHOD> <URL>
示例 4.1:发送一个 HEAD 请求
HEAD
请求与 GET
请求类似,但服务器只返回响应头,不返回响应体。这常用于获取资源信息(如大小、修改时间)而不下载整个资源。
bash
curl -X HEAD https://www.example.com
或者更常用的方式,直接使用 -I
选项,它等同于 curl -X HEAD -i
(同时显示头信息):
bash
curl -I https://www.example.com
输出将只包含 HTTP 响应头信息,例如:
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Encoding: gzip
Content-Length: 648
Content-Type: text/html; charset=UTF-8
Date: Wed, 25 Oct 2023 05:00:00 GMT
Etag: "3147526947+ident"
Expires: Wed, 01 Nov 2023 05:00:00 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (sec/9DCC)
Vary: Accept-Encoding
X-Cache: HIT
示例 4.2:发送一个 POST 请求
POST
请求常用于提交数据到服务器。你可以使用 -d
或 --data
选项来指定要发送的数据。
bash
curl -X POST -d "param1=value1¶m2=value2" https://httpbin.org/post
httpbin.org
是一个非常方便的测试 HTTP 请求的网站。向 https://httpbin.org/post
发送 POST 请求,它会返回你发送的请求的详细信息。
在这个示例中,-d "param1=value1¶m2=value2"
表示要发送的数据是 param1=value1¶m2=value2
。默认情况下,-d
会将数据作为 application/x-www-form-urlencoded
格式发送,并自动设置 Content-Type
头部。
示例 4.3:发送 JSON 数据
在现代 Web 开发中,POST 请求发送 JSON 数据非常常见。这时,你需要做两件事:
1. 使用 -d
发送 JSON 字符串。
2. 使用 -H
选项明确设置 Content-Type
头部为 application/json
。
bash
curl -X POST -H "Content-Type: application/json" -d '{"name": "John", "age": 30}' https://httpbin.org/post
注意 JSON 数据字符串使用了单引号 '
包围,以避免 shell 解析双引号 "
。如果 JSON 字符串本身包含单引号,你需要进行转义或使用其他引用方式。
5. 处理响应:保存输出与查看头部
默认情况下,curl
将响应体直接输出到终端。你可能希望将输出保存到文件,或者查看完整的响应头信息。
5.1 保存输出到文件
-
使用
-o
(小写 o):将输出保存到指定的文件名。
bash
curl -o baidu.html https://www.baidu.com
这会将百度首页的 HTML 内容保存到当前目录下的baidu.html
文件。 -
使用
-O
(大写 O):根据 URL 中最后一个斜杠后的部分自动命名保存文件。这在下载文件时非常方便。
bash
curl -O https://www.example.com/images/logo.png
这会将logo.png
文件下载并保存为当前目录下的logo.png
。你也可以同时下载多个文件:
bash
curl -O https://example.com/file1.txt -O https://example.com/file2.zip -
使用重定向: 对于简单的输出保存,也可以使用 shell 的重定向功能。
bash
curl https://www.baidu.com > baidu_output.html
这与-o
的效果类似,但-o
提供了更多控制(例如在文件已存在时的行为)。
5.2 查看响应头
-
使用
-i
(或--include
): 在输出响应体之前,先输出完整的响应头信息。
bash
curl -i https://www.example.com
输出会先是 HTTP 状态行和所有响应头,然后是响应体。 -
使用
-I
(或--head
): 只发送HEAD
请求,因此只显示响应头信息,不显示响应体。
bash
curl -I https://www.example.com
这在快速检查某个 URL 是否存在、状态码或者获取一些元信息(如Content-Length
)时非常有用。
6. 发送请求头 (-H
)
HTTP 头部包含了很多关于请求或响应的元信息,如用户代理(User-Agent)、内容类型(Content-Type)、认证信息(Authorization)等。使用 -H
或 --header
选项可以添加自定义的请求头。
bash
curl -H "Header-Name: Header-Value" <URL>
可以指定多个 -H
选项来发送多个头部。
示例 6.1:模拟浏览器发送请求
有些网站会检查请求的 User-Agent 头部,如果不是常见的浏览器 User-Agent,可能会拒绝服务或返回不同内容。你可以通过设置 User-Agent
头部来模拟浏览器:
bash
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" https://www.example.com
示例 6.2:发送 API 密钥(Authorization 头部)
许多 API 使用 Authorization
头部进行认证,例如 Bearer Token:
bash
curl -H "Authorization: Bearer YOUR_API_TOKEN" https://api.example.com/data
或者 Basic Auth (也可以用 -u
选项,更简洁,下面会介绍)。
示例 6.3:指定接受的内容类型 (Accept 头部)
告诉服务器客户端希望接收哪种类型的内容,例如 JSON:
bash
curl -H "Accept: application/json" https://api.example.com/resource
7. 发送数据 (-d
, -F
)
除了 -d
用于发送 POST 数据(通常是 application/x-www-form-urlencoded
或 application/json
)外,curl
还提供了其他发送数据的方式。
7.1 使用 -d
(或 --data
)
如前所述,-d
用于发送 POST 数据。除了直接指定字符串,你还可以从文件中读取数据作为 POST 请求体。使用 @
符号后跟文件名:
bash
curl -X POST -H "Content-Type: application/json" -d @data.json https://httpbin.org/post
这会读取 data.json
文件的内容作为请求体发送。
7.2 使用 -F
(或 --form
) 进行表单提交和文件上传
-F
选项用于构建 multipart/form-data
类型的请求,这常用于网页表单提交或文件上传。
-
发送普通表单字段:
bash
curl -F "name=John Doe" -F "[email protected]" https://httpbin.org/post
这模拟了提交一个包含name
和email
字段的表单。 -
上传文件: 使用
@
符号指定要上传的文件路径。
bash
curl -F "profile_picture=@/path/to/your/image.jpg" https://httpbin.org/post
这会将本地文件/path/to/your/image.jpg
作为名为profile_picture
的字段进行上传。 -
同时发送字段和文件:
bash
curl -F "username=johndoe" -F "report=@/path/to/report.pdf" https://httpbin.org/post
7.3 使用 -T
(或 --upload-file
) 上传文件
-T
选项通常用于使用 PUT 方法直接上传文件作为请求体,例如上传到 WebDAV 服务器。
bash
curl -T /path/to/local/file.txt https://example.com/webdav/remote_file.txt
这会将 local/file.txt
的内容通过 PUT 方法发送到指定的 URL,远程文件将被命名为 remote_file.txt
。
8. 认证 (-u
)
对于需要基本认证(Basic Authentication)的资源,可以使用 -u
或 --user
选项指定用户名和密码。
bash
curl -u username:password <URL>
示例 8.1:使用基本认证访问受保护资源
bash
curl -u admin:secret https://example.com/admin/status
curl
会自动构造并发送 Authorization: Basic base64_encoded_username:password
头部。请注意,基本认证信息是经过 Base64 编码而不是加密的,因此在不安全的连接(HTTP)上使用时存在风险。
如果只提供用户名,curl
会在执行命令时提示你输入密码:
bash
curl -u admin https://example.com/admin/status
Enter host password for user 'admin':
9. HTTPS 与证书 (-k
)
curl
默认支持 HTTPS,并且会验证服务器证书的有效性。如果证书无效(例如自签名证书、过期、域名不匹配等),curl
会拒绝连接并报错。
在某些测试场景下,你可能需要忽略证书验证错误。可以使用 -k
或 --insecure
选项。
bash
curl -k https://self-signed.example.com/resource
重要提示: 绝对不要 在生产环境或处理敏感数据时使用 -k
选项,因为它会禁用重要的安全检查,使你的连接容易受到中间人攻击。它仅适用于测试和开发环境。
10. 处理重定向 (-L
)
当请求一个 URL 时,服务器有时会返回一个重定向响应(HTTP 状态码 3xx),指示客户端去访问另一个 URL。默认情况下,curl
不会自动跟随重定向。它只会显示收到的重定向响应。
使用 -L
或 --location
选项可以让 curl
自动跟随服务器的重定向。
bash
curl -L http://shorturl.example.com
这个命令会访问 shorturl.example.com
,如果它返回一个重定向到 http://longurl.example.com
,curl
会自动发起对 http://longurl.example.com
的请求并显示其内容。
11. 使用代理 (-x
)
如果你的网络环境需要通过代理服务器访问外部资源,可以使用 -x
或 --proxy
选项指定代理服务器地址。
bash
curl -x http://proxy.example.com:8080 https://www.example.com
你可以指定 HTTP、HTTPS、SOCKS4、SOCKS5 等多种类型的代理。例如 SOCKS5 代理:
bash
curl -x socks5://user:[email protected]:1080 https://www.example.com
12. 显示进度条和静默模式 (-s
)
当你下载大文件时,curl
默认会显示一个进度条,展示下载进度、速度和剩余时间。
bash
curl -O https://example.com/largefile.zip
输出示例:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 10.0M 100 10.0M 0 0 1234k 0 0:00:08 0:00:08 --:--:-- 1500k
在脚本中或者你不关心进度信息时,可以使用 -s
或 --silent
选项来禁止显示进度条和错误信息。
bash
curl -s https://www.example.com > output.html
这非常适合将 curl
的输出作为另一个命令的输入,或者将结果保存到文件而不产生额外的终端输出。
结合 -S
(大写 S, --show-error
) 选项,可以在静默模式下,如果发生错误仍然显示错误信息:
bash
curl -sS https://invalid.url/
如果 URL 无效,即使在静默模式下,也会输出错误信息。
13. 详细输出 (-v
)
当调试网络请求或理解 curl
的行为时,-v
或 --verbose
选项是你的好帮手。它会显示连接建立过程、发送的请求头、接收的响应头、SSL 握手信息等等详细信息。
bash
curl -v https://www.example.com
-v
的输出非常详细,可以帮助你诊断为什么请求没有按预期工作,例如查看哪些头部被发送了,或者 SSL/TLS 连接是否成功建立。
14. 处理 Cookies (-b
, -c
)
HTTP Cookies 用于维护会话状态。curl
允许你发送 Cookie 给服务器,或者将服务器返回的 Cookie 保存到文件。
-
使用
-b
(或--cookie
) 发送 Cookies:
你可以直接在命令行中指定 Cookie 字符串:
bash
curl -b "sessionid=abcdef123; user=johndoe" https://example.com/resource
或者从一个文件中读取 Cookies。这个文件通常是之前使用-c
选项保存的 Cookie 文件(Netscape cookie file format)。
bash
curl -b cookies.txt https://example.com/resource -
使用
-c
(或--cookie-jar
) 保存 Cookies:
将服务器在响应中设置的 Cookies 保存到指定的文件。
bash
curl -c cookies.txt https://example.com/login
执行此命令后,cookies.txt
文件将包含从example.com/login
收到的所有 Cookies。下次访问该网站的其他页面时,可以使用-b cookies.txt
来携带这些 Cookies。
示例 14.1:登录并访问需要认证的页面
假设登录页面是 /login
,需要认证的页面是 /profile
:
“`bash
1. 模拟登录并保存收到的 Cookies
curl -c my_cookies.txt -d “username=testuser&password=testpass” https://example.com/login
2. 使用保存的 Cookies 访问需要认证的页面
curl -b my_cookies.txt https://example.com/profile
“`
这样,你就模拟了一个简单的登录并保持会话的过程。
15. 设置超时 (-m
)
在网络条件不好或者服务器响应慢的情况下,你可能希望设置一个请求的超时时间,避免命令长时间挂起。
使用 -m
或 --max-time
选项可以设置整个请求的最大允许时间(连接、发送、接收的总时间),单位是秒。
bash
curl -m 10 https://slow.example.com/resource
如果整个过程超过 10 秒,curl
会终止请求并报错。
还有一些更精细的超时选项,例如 --connect-timeout
用于设置连接阶段的超时时间。
16. 杂项常用选项
-
-A
(或--user-agent
): 设置 User-Agent 头部,功能与-H "User-Agent: ..."
相同,更简洁。
bash
curl -A "MyCustomClient/1.0" https://www.example.com -
--referer
: 设置 Referer 头部,指示请求是从哪个页面链接过来的。
bash
curl --referer "https://www.google.com" https://www.example.com -
-e
(或--referer
): 也是设置 Referer 头部,但也可以用于发送 cookie header 中的 referer 字段(较少用)。推荐使用--referer
。 -
--limit-rate
: 限制传输速度,例如限制下载速度不超过 100KByte/sec。
bash
curl --limit-rate 100K -O https://example.com/largefile.zip
可以使用 k, m, g 后缀(KB, MB, GB)。
17. 总结与实践
curl
作为一个命令行工具,其功能远不止本文介绍的这些基本用法。但掌握了 -X
(方法)、-d
(POST数据)、-H
(头部)、-o
/-O
(保存输出)、-i
/-I
(查看头部)、-u
(认证)、-L
(重定向)、-s
/-v
(静默/详细)、-b
/-c
(Cookies) 这些核心选项,你已经可以应对绝大多数日常的网络交互任务了。
学习 curl
最好的方法是动手实践。利用 httpbin.org
这样的网站来发送各种类型的请求,观察 curl
的输出以及 httpbin.org
返回的请求信息,能帮助你快速理解 HTTP 协议和 curl
各个选项的作用。
记住以下几点:
curl <URL>
默认发送 GET 请求,输出响应体。-X
指定 HTTP 方法。-d
发送 POST 数据,默认application/x-www-form-urlencoded
。发送 JSON 需要-H "Content-Type: application/json"
。-H
添加自定义请求头。-o
或-O
保存输出到文件。-i
或-I
查看响应头。-L
跟随重定向。-v
显示详细的请求和响应过程,是调试利器。-s
静默模式,常用于脚本。
curl
是一个强大的工具,深入学习它的手册页 (man curl
) 会发现更多高级功能,如限速、断点续传、FTP 操作、LDAP 查询等等。但从基本用法开始,逐步探索,你就能充分发挥这个命令行利器的威力。
希望这篇文章能帮助你全面了解并掌握 curl
的基本用法!