curl 命令基础:参数使用与结果输出教程
curl
是一个强大而灵活的命令行工具,用于传输数据,支持多种协议,包括 HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP, LDAPS, FILE, POP3, POP3S, IMAP, IMAPS, SMTP, SMTPS, RTMP, RTSP 等等。它是开发者、系统管理员以及任何需要与网络资源交互的人必备的工具之一。
尽管 curl
功能强大,但其基础用法相对直观。本文将详细介绍 curl
的基础知识,包括如何使用常见的参数来控制请求行为,以及如何理解和处理命令的输出结果。
目录
- 什么是 curl?
- 基础用法:发起一个简单的 GET 请求
- 理解 curl 的参数
- 单字母参数 vs. 长参数
- 参数的组合使用
- 控制请求行为的常用参数
- 指定 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
)
- 指定 HTTP 方法 (
- 理解 curl 的输出结果
- 默认输出:响应体
- 显示请求和响应头 (
-I
,--head
) - 详细输出:查看整个交互过程 (
-v
,--verbose
) - 控制进度条和错误信息 (
-s
,--silent
,-S
,--show-error
)
- 处理输出:将结果保存到文件
- 指定文件名 (
-o
,--output
) - 使用远程文件名 (
-O
,--remote-name
) - 断点续传 (
-C
,--continue-at
)
- 指定文件名 (
- 使用 curl 进行身份验证
- 基本认证 (
-u
,--user
)
- 基本认证 (
- 高级基础:上传文件
- 使用
-T
(--upload-file
)
- 使用
- 常见使用场景示例
- 总结
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
… 更多 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.
“`
注意,在下载大文件时,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
解释:
这个命令发送了一个包含 username
和 password
的 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
命令!