命令行利器 curl:基本用法与示例 – wiki基地


命令行利器 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?

  1. 通用性强: 支持大量网络协议,几乎可以处理你能想到的所有与网络传输相关的任务。
  2. 跨平台: 在几乎所有主流操作系统(Linux, macOS, Windows)上都可以使用,且行为一致。
  3. 无图形界面: 极适合用于脚本自动化、批量处理、服务器环境操作。
  4. 功能强大且灵活: 可以精细控制请求的各个方面,如方法、头部、数据、认证、代理、超时等。
  5. 排查网络问题: 是诊断 HTTP/HTTPS 请求、查看响应头、调试 API 的利器。
  6. 下载/上传: 可以方便地从网络下载文件,或者向服务器上传数据。

总之,curl 是一个网络交互的瑞士军刀,掌握它能极大地提高工作效率。

2. 安装 curl

在绝大多数现代操作系统中,curl 都已经预装。你可以在终端中输入以下命令来检查是否安装以及查看版本:

bash
curl --version

如果命令执行成功并显示版本信息,说明你已经拥有 curl

如果未安装,可以通过各平台的包管理器进行安装:

  • Debian/Ubuntu: sudo apt update && sudo apt install curl
  • RHEL/CentOS/Fedora: sudo yum install curlsudo 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&param2=value2" https://httpbin.org/post

httpbin.org 是一个非常方便的测试 HTTP 请求的网站。向 https://httpbin.org/post 发送 POST 请求,它会返回你发送的请求的详细信息。

在这个示例中,-d "param1=value1&param2=value2" 表示要发送的数据是 param1=value1&param2=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-urlencodedapplication/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

    这模拟了提交一个包含 nameemail 字段的表单。

  • 上传文件: 使用 @ 符号指定要上传的文件路径。
    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.comcurl 会自动发起对 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 的基本用法!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部