curl 命令基础:参数使用与结果输出教程 – wiki基地


curl 命令基础:参数使用与结果输出教程

curl 是一个强大而灵活的命令行工具,用于传输数据,支持多种协议,包括 HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP, LDAPS, FILE, POP3, POP3S, IMAP, IMAPS, SMTP, SMTPS, RTMP, RTSP 等等。它是开发者、系统管理员以及任何需要与网络资源交互的人必备的工具之一。

尽管 curl 功能强大,但其基础用法相对直观。本文将详细介绍 curl 的基础知识,包括如何使用常见的参数来控制请求行为,以及如何理解和处理命令的输出结果。

目录

  1. 什么是 curl?
  2. 基础用法:发起一个简单的 GET 请求
  3. 理解 curl 的参数
    • 单字母参数 vs. 长参数
    • 参数的组合使用
  4. 控制请求行为的常用参数
    • 指定 HTTP 方法 (-X, --request)
    • 发送数据 (-d, --data, -F, --form)
    • 添加请求头 (-H, --header)
    • 指定 User-Agent (-A, --user-agent)
    • 处理重定向 (-L, --location)
    • 设置超时 (--connect-timeout, --max-time)
    • 禁用 SSL/TLS 校验 (-k, --insecure)
    • 限速 (--limit-rate)
  5. 理解 curl 的输出结果
    • 默认输出:响应体
    • 显示请求和响应头 (-I, --head)
    • 详细输出:查看整个交互过程 (-v, --verbose)
    • 控制进度条和错误信息 (-s, --silent, -S, --show-error)
  6. 处理输出:将结果保存到文件
    • 指定文件名 (-o, --output)
    • 使用远程文件名 (-O, --remote-name)
    • 断点续传 (-C, --continue-at)
  7. 使用 curl 进行身份验证
    • 基本认证 (-u, --user)
  8. 高级基础:上传文件
    • 使用 -T (--upload-file)
  9. 常见使用场景示例
  10. 总结

1. 什么是 curl?

curl 是一个命令行工具,由 libcurl 库驱动。它的主要功能是根据指定的 URL 进行数据传输。你可以用它来下载文件、上传数据、测试 API、检查网站状态等等。curl 的设计目标是可靠、高效且支持广泛的协议。几乎所有的类 Unix 系统(Linux, macOS)都预装了 curl,Windows 10/11 也已经将其作为内置命令。

2. 基础用法:发起一个简单的 GET 请求

最基础的 curl 命令只需要指定一个 URL。默认情况下,curl 会向该 URL 发起一个 HTTP GET 请求,并将接收到的响应体(通常是 HTML 内容)输出到标准输出(终端)。

命令示例:

bash
curl https://www.example.com

解释:

执行此命令后,curl 会连接到 https://www.example.com,发起一个 GET 请求,然后将服务器返回的 HTML 内容直接显示在你的终端上。

默认输出:

你会看到类似以下内容的输出(取决于网页的实际内容):

“`html




Example Domain
… 更多 HTML 内容 …

Example Domain

This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.

More information…


“`

注意,在下载大文件时,curl 默认还会显示一个进度条。我们后面会介绍如何控制这个进度条。

3. 理解 curl 的参数

curl 的强大之处在于其丰富的参数(也称为选项或标志),它们允许你精细地控制请求的各个方面。

单字母参数 vs. 长参数

curl 的参数通常有两种形式:

  • 单字母参数: 以一个破折号 - 开头,后面紧跟一个字母,例如 -X。如果参数需要一个值,通常值紧跟在字母后面,或者用空格隔开。例如 -X POST-o filename.txt
  • 长参数: 以两个破折号 -- 开头,后面是参数的完整英文名称,例如 --request。如果参数需要一个值,使用空格或等号分隔。例如 --request POST--output filename.txt--output=filename.txt

长参数通常更具可读性,而单字母参数在命令行中更简洁。两者功能相同,你可以根据个人喜好选择使用。

参数的组合使用

你可以将多个单字母参数组合在一起(如果它们不需要自己的值),例如 -sS 相当于 -s -S。对于需要值的参数,通常不能直接组合,例如 -o filename.txt -L 是正确的,而 -o filename.txtL 是错误的。

4. 控制请求行为的常用参数

这部分将详细介绍一些最常用、最重要的 curl 参数,它们决定了 curl 发起请求时会做什么。

指定 HTTP 方法 (-X, --request)

默认情况下,curl 使用 GET 方法。使用 -X--request 参数可以指定其他 HTTP 方法,如 POST, PUT, DELETE, etc.

语法:

“`bash
curl -X

curl –request
“`

示例: 发起一个 POST 请求

bash
curl -X POST https://httpbin.org/post

解释:

这个命令向 https://httpbin.org/post 发起一个 POST 请求。httpbin.org 是一个非常方便的在线服务,用于测试 HTTP 请求,它会将收到的请求信息(包括方法、头、数据等)作为 JSON 格式返回。

示例输出 (部分):

json
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.81.0"
},
"json": null,
"origin": "...",
"url": "https://httpbin.org/post"
}

可以看到,"method": "POST" 证明请求方法被成功设置为 POST。

发送数据 (-d, --data, -F, --form)

在 POST, PUT 等请求中,通常需要向服务器发送数据。curl 提供了多种方式来发送数据。

  • -d, --data <data>: 用于发送 URL-encoded 的 POST 数据。多个 -d 参数会将数据用 & 连接起来。数据可以是 key=value 形式,也可以是原始字符串。如果数据以 @ 开头,后面接文件名,则会从文件中读取数据。
  • -F, --form <name=content>: 用于发送 multipart/form-data 格式的数据,通常用于模拟 HTML 表单提交,包括文件上传。

示例 1: 使用 -d 发送 URL-encoded 数据

bash
curl -X POST -d "username=admin&password=123456" https://httpbin.org/post

解释:

这个命令发送了一个包含 usernamepassword 的 POST 请求数据。curl 会自动设置 Content-Type: application/x-www-form-urlencoded 头(除非你手动指定)。

示例输出 (部分):

json
{
"args": {},
"data": "username=admin&password=123456",
"files": {},
"form": {
"password": "123456",
"username": "admin"
},
"headers": {
...
"Content-Length": "30",
"Content-Type": "application/x-www-form-urlencoded",
...
},
...
}

可以看到,发送的数据被服务器正确接收并在 "data""form" 字段中体现。

示例 2: 使用 -d 发送 JSON 数据

发送 JSON 数据时,通常需要同时设置 Content-Type: application/json 头。

bash
curl -X POST -H "Content-Type: application/json" -d '{"name": "test", "age": 30}' https://httpbin.org/post

解释:

这里我们通过 -H 参数指定了 Content-Type,并通过 -d 发送了一个 JSON 字符串。注意,JSON 字符串通常包含特殊字符(如引号),最好用单引号 ' 包围,或者对双引号 " 进行转义 \"

示例输出 (部分):

json
{
"args": {},
"data": "{\"name\": \"test\", \"age\": 30}",
"files": {},
"form": {},
"headers": {
...
"Content-Length": "25",
"Content-Type": "application/json",
...
},
"json": {
"age": 30,
"name": "test"
},
...
}

服务器将收到的 JSON 数据解析后放在了 "json" 字段。

示例 3: 使用 -F 发送 multipart/form-data

bash
curl -F "file=@/path/to/your/local/file.txt" -F "username=admin" https://httpbin.org/post

解释:

这个命令模拟了一个包含文件上传和普通字段的表单提交。@ 符号告诉 curl 读取本地文件 /path/to/your/local/file.txt 的内容作为 file 字段的值。username=admin 则是一个普通的文本字段。

示例输出 (部分):

json
{
"args": {},
"data": "",
"files": {
"file": "..." // 文件内容会在这里显示一部分或全部
},
"form": {
"username": "admin"
},
"headers": {
...
"Content-Type": "multipart/form-data; boundary=...", // curl 会自动生成 boundary
...
},
...
}

文件内容出现在 "files" 字段,普通字段出现在 "form" 字段。

添加请求头 (-H, --header)

使用 -H--header 参数可以向请求中添加自定义的 HTTP 头。这对于 API 调用、身份验证、指定内容类型等非常有用。

语法:

“`bash
curl -H “

curl –header “
“`

可以指定多个 -H 参数来添加多个头。

示例: 添加一个自定义头和一个标准的 Accept

bash
curl -H "X-My-Custom-Header: test_value" -H "Accept: application/json" https://httpbin.org/headers

解释:

这个命令向 https://httpbin.org/headers 发起请求,并添加了两个头。httpbin.org/headers 会将收到的所有请求头作为 JSON 返回。

示例输出 (部分):

json
{
"headers": {
"Accept": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.81.0",
"X-My-Custom-Header": "test_value"
}
}

可以看到,我们添加的两个头都成功发送并被服务器接收。

指定 User-Agent (-A, --user-agent)

默认情况下,curl 会发送一个包含 curl 版本信息的 User-Agent 头,例如 User-Agent: curl/7.81.0。使用 -A--user-agent 可以覆盖这个默认值,模拟不同的客户端(如浏览器)。

示例: 模拟 Firefox 浏览器

bash
curl -A "Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0" https://httpbin.org/user-agent

解释:

httpbin.org/user-agent 会返回它检测到的 User-Agent 头。

示例输出:

json
{
"user-agent": "Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0"
}

处理重定向 (-L, --location)

很多网页或 API 会使用 HTTP 重定向(例如 301, 302 状态码)将客户端导向另一个 URL。默认情况下,curl 不会 自动跟随重定向。它会显示重定向的响应信息,然后退出。使用 -L--location 参数可以让 curl 自动跟随重定向,直到到达最终目标或达到最大重定向次数限制(通常是 50 次)。

示例: 访问一个会重定向的 URL

“`bash

尝试访问 http://httpbin.org/redirect/1 (会重定向一次)

不使用 -L

curl http://httpbin.org/redirect/1
“`

示例输出 (部分):

“`html






“`

可以看到,只返回了一个空的 HTML 页面。如果你同时使用 -v 参数,你会看到 302 或 301 状态码和 Location 头。

“`bash

使用 -L

curl -L http://httpbin.org/redirect/1
“`

示例输出 (部分):

这次你会看到最终重定向目标的页面内容,例如 http://httpbin.org/get 的内容:

json
{
"args": {},
"headers": { ... },
"origin": "...",
"url": "http://httpbin.org/get"
}

使用 -L 是获取网页最终内容或 API 实际响应的关键。

设置超时 (--connect-timeout, --max-time)

网络不稳定或服务器响应慢时,请求可能会长时间挂起。可以使用超时参数来防止这种情况。

  • --connect-timeout <seconds>: 设置连接阶段允许的最长秒数。
  • --max-time <seconds>: 设置整个传输过程允许的最长秒数(从开始连接到接收完数据)。

示例: 设置连接超时 5 秒,总超时 10 秒

bash
curl --connect-timeout 5 --max-time 10 https://www.example.com

如果连接在 5 秒内未能建立,或者整个传输在 10 秒内未能完成,curl 会中断并报错。

禁用 SSL/TLS 校验 (-k, --insecure)

当访问使用自签名证书或证书有问题的 HTTPS 站点时,curl 默认会因为无法验证证书而拒绝连接。-k--insecure 参数会禁用证书校验,允许 curl 继续连接。

重要提示: 使用 -k 会忽略 SSL/TLS 证书带来的安全保护,使得连接容易受到中间人攻击。除非你清楚自己在做什么(例如在测试环境访问内部服务),否则不应该使用这个参数。

示例: 忽略证书错误访问 HTTPS 站点

bash
curl -k https://self-signed.badssl.com/

解释:

如果 https://self-signed.badssl.com/ 使用自签名证书,没有 -k 参数时 curl 会报错退出。使用 -k 则可以正常访问。

限速 (--limit-rate)

可以使用 --limit-rate 参数限制数据传输的速率,格式是 rate[/[KMGT]B],例如 100K (100KB/s),1M (1MB/s)。

示例: 下载文件并限速 100KB/s

bash
curl --limit-rate 100K -O https://releases.ubuntu.com/.../ubuntu-22.04.1-live-server-amd64.iso

这有助于在下载大文件时避免占用过多带宽。

5. 理解 curl 的输出结果

除了控制请求行为,理解 curl 的输出也是非常重要的。

默认输出:响应体

如前所述,curl 的默认输出是服务器响应的响应体。对于网页就是 HTML,对于 API 可能是 JSON 或 XML,对于文件就是文件内容。

显示请求和响应头 (-I, --head)

如果你只对 HTTP 响应头感兴趣(例如,检查状态码、重定向信息、内容类型、缓存信息等),可以使用 -I--head 参数。这会向服务器发送一个 HEAD 请求(而不是 GET),服务器通常只会返回响应头,而不会返回响应体。

示例: 只获取响应头

bash
curl -I https://www.example.com

示例输出:

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Wed, 25 Oct 2023 10:30:00 GMT
Etag: "3147526947+ident"
Expires: Wed, 01 Nov 2023 10:30:00 GMT
Last-Modified: Wed, 17 Oct 2018 11:26:21 GMT
Server: ECS (sac/54D5)
Vary: Accept-Encoding
Content-Length: 1256

这个输出显示了服务器返回的状态行 (HTTP/1.1 200 OK) 和所有的响应头。200 OK 表示请求成功。

详细输出:查看整个交互过程 (-v, --verbose)

-v--verbose 参数会提供非常详细的输出,包括 curl 如何解析 URL、连接过程、发送的请求头、接收的响应头,以及传输的数据(通常以二进制形式显示部分)。这对于调试非常有用。

示例: 查看详细的请求/响应过程

bash
curl -v https://www.example.com

示例输出 (部分):

“`
* Trying 93.184.216.34:443…
* Connected to www.example.com (93.184.216.34) port 443 (#0)
* ALPN: offers h2
* ALPN: offers http/1.1
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: none
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS header, Finished (20):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.2 (IN), TLS header, Finished (20):
* TLSv1.2 (OUT), TLS header, Finished (20):
* TLSv1.2 (IN), TLS header, Alert (21):
* using HTTP/1.1

GET / HTTP/1.1
Host: www.example.com
User-Agent: curl/7.81.0
Accept: /

  • Mark added to connection 0
  • Stream #0: server 93.184.216.34 is ALPN enabled
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Cache-Control: max-age=604800
    < Content-Type: text/html; charset=UTF-8
    < Date: Wed, 25 Oct 2023 10:30:00 GMT
    < Etag: “3147526947+ident”
    < Expires: Wed, 01 Nov 2023 10:30:00 GMT
    < Last-Modified: Wed, 17 Oct 2018 11:26:21 GMT
    < Server: ECS (sac/54D5)
    < Vary: Accept-Encoding
    < Content-Length: 1256
    <
    { [1256 bytes data]
  • Connection #0 to host www.example.com left intact
    … (响应体内容) …
    “`
  • * 开头的行是 curl 的信息,描述连接过程。
  • > 开头的行是 curl 发送给服务器的请求。
  • < 开头的行是服务器返回的响应头。
  • { ... bytes data] 表示响应体的数据。

控制进度条和错误信息 (-s, --silent, -S, --show-error)

默认情况下,curl 在传输过程中会显示一个进度条(特别是在下载大文件时),并在出错时打印错误信息到标准错误。

  • -s--silent: 静默模式。禁止显示进度条和大多数错误信息。这在脚本中非常有用,可以避免不必要的输出干扰。
  • -S--show-error: 结合 -s 使用。在 -s 静默模式下,如果发生错误,-S 会确保错误信息仍然被打印到标准错误。

示例: 静默下载,但显示错误

bash
curl -sS -O https://example.com/nonexistent_file.zip

如果文件不存在,没有 -sS 可能只会显示 404 响应体(如果服务器提供了)。使用 -sS 并且服务器返回非 2xx 状态码,curl 会在标准错误输出类似 curl: (22) The requested URL returned error: 404 的信息(具体取决于 curl 版本和错误类型)。如果网络错误,则会显示网络错误信息。

6. 处理输出:将结果保存到文件

默认情况下,curl 将响应体输出到标准输出。你可以使用参数将其保存到文件。

指定文件名 (-o, --output)

-o <filename>--output <filename> 参数将接收到的响应体保存到指定的文件名。

示例: 将网页保存为 example.html

bash
curl -o example.html https://www.example.com

执行后,网页的 HTML 内容将保存到当前目录下的 example.html 文件中。

使用远程文件名 (-O, --remote-name)

-O--remote-name 参数根据 URL 中最后一个斜杠后的部分,自动确定文件名并将响应体保存到该文件。通常用于下载文件。

示例: 下载文件并使用远程文件名

bash
curl -O https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso

这将下载 Ubuntu ISO 文件,并将其保存为 ubuntu-22.04.3-live-server-amd64.iso

注意: 如果 URL 中没有文件名部分(例如 https://example.com/),-O 可能无法确定文件名或使用默认名称(如 index.html),在这种情况下 -o 更合适。

断点续传 (-C, --continue-at)

当下载中断时,可以使用 -C ---continue-at - 参数尝试从上次中断的地方继续下载。curl 会检查本地已存在文件的大小,并向服务器发送一个 Range 请求,从正确的位置开始下载剩余部分。

示例: 续传文件下载

bash
curl -C - -O https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso

如果当前目录下已经存在一个同名文件,curl 会尝试续传。

7. 使用 curl 进行身份验证

许多 Web 服务需要身份验证。curl 支持多种认证方式。

基本认证 (-u, --user)

对于 HTTP Basic Authentication,可以使用 -u <username>:<password>--user <username>:<password> 参数。

示例: 使用基本认证访问受保护的资源

bash
curl -u "myuser:mypassword" https://httpbin.org/basic-auth/myuser/mypassword

解释:

httpbin.org/basic-auth/:user/:passwd 是一个测试基本认证的服务。如果你提供的用户名和密码正确,它会返回成功信息。

示例输出:

json
{
"authenticated": true,
"user": "myuser"
}

注意: 在命令行直接输入密码存在安全风险(例如,密码可能被命令历史记录或进程列表记录)。对于更安全的方式,可以省略 :password 部分,curl 会提示你输入密码。或者使用 --netrc 参数从 ~/.netrc 文件读取凭据。

8. 高级基础:上传文件

除了下载,curl 也可以用于上传文件。

使用 -T (--upload-file)

-T <local-file>--upload-file <local-file> 参数用于上传本地文件到指定的 URL。这通常用于 PUT 请求。

示例: 将本地文件上传到服务器(假设服务器支持 PUT 上传)

bash
curl -T /path/to/local/file.txt https://example.com/upload/newfile.txt

解释:

这个命令会读取 /path/to/local/file.txt 的内容,并使用 PUT 方法将其发送到 https://example.com/upload/newfile.txt。服务器需要配置为接收 PUT 请求并将数据保存为 newfile.txt

9. 常见使用场景示例回顾

  • 测试网站是否可访问: curl -I https://www.example.com (快速检查状态码)
  • 下载文件: curl -O https://example.com/bigfile.zip
  • 从 API 获取 JSON 数据: curl -H "Accept: application/json" https://api.example.com/users
  • 向 API 发送 POST 数据: curl -X POST -H "Content-Type: application/json" -d '{"key": "value"}' https://api.example.com/data
  • 检查重定向目标: curl -v http://shorturl.com/xyz (不使用 -L) 或 curl -sL -I http://shorturl.com/xyz (获取最终目标的头信息)
  • 模拟浏览器访问: curl -A "Mozilla/5.0..." https://www.example.com
  • 调试网络问题: curl -v https://problematic.site

10. 总结

curl 是一个功能极其强大的网络数据传输工具。掌握其基础参数和输出控制,能让你轻松地从命令行与各种网络服务交互。

  • 基本用法: curl <URL> 获取响应体。
  • 参数: 使用 --- 调整行为,如 -X (方法), -d (POST数据), -H (请求头), -L (重定向)。
  • 输出: 默认显示响应体。-I 显示响应头,-v 显示详细过程。-o-O 保存到文件。-s 静默输出,-S 结合 -s 显示错误。
  • 调试: -v 是你的好朋友。

本文仅仅介绍了 curl 的基础知识和最常用参数。curl 还有许多其他高级功能,例如 cookie 处理、代理设置、TLS/SSL 高级配置、FTP/SFTP 等协议的支持等等。当你遇到更复杂的网络传输需求时,查阅 curl 的官方文档 (man curl 或在线文档) 将非常有帮助。

勤加练习是掌握 curl 的最好方法。尝试用 curl 访问你经常访问的网站或使用的 API,观察不同的参数如何影响请求和响应。

希望这篇详细的基础教程能帮助你更好地理解和使用 curl 命令!


发表评论

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

滚动至顶部