Curl 命令参数详解及实用示例:网络数据传输的瑞士军刀
curl
是一个强大的命令行工具,用于通过各种网络协议传输数据。它的名字是 “Client for URLs” 的缩写。无论是下载文件、测试 API 接口、调试网络请求,还是自动化网络任务,curl
都表现出色,被誉为网络数据传输领域的“瑞士军刀”。
curl
支持多种协议,包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、DICT、TELNET、LDAP、LDAPS、FILE、POP3、POP3S、SMTP、SMTPS、RTMP、RTSP、IMAP、IMAPS、SMB、SMBS、GOPHER 和 MQTT。这使得它几乎能应对所有基于 URL 的数据交互需求。
本文将深入探讨 curl
的常用参数,并通过丰富的示例展示其强大的功能。
curl
的基本用法
最简单的 curl
命令只需要指定一个 URL:
bash
curl https://www.example.com
这个命令会向 https://www.example.com
发起一个 GET 请求,并将服务器返回的 HTML 内容输出到标准输出(通常是你的终端)。
核心参数详解
curl
拥有数百个选项,但掌握一些核心参数就能解决绝大多数问题。下面我们来详细讲解这些常用参数:
1. 控制输出和保存文件
-
-o <file>
/--output <file>
: 将接收到的数据保存到指定的文件,而不是输出到标准输出。如果你需要下载文件,这是最常用的选项。bash
curl -o myfile.html https://www.example.com这个命令会将
https://www.example.com
的内容保存到名为myfile.html
的文件中。 -
-O
/--remote-name
: 根据远程文件的名字保存到本地文件。当 URL 指向一个文件名明确的资源时非常方便。bash
curl -O https://www.example.com/images/logo.png这个命令会将图片保存为
logo.png
文件。 -
-s
/--silent
: 静默模式,不显示进度条和错误信息。常用于脚本中,只关心最终结果。bash
curl -s https://www.example.com -
-v
/--verbose
: 详细模式,显示请求和响应的详细信息,包括头信息、SSL/TLS 握手过程等。对于调试非常有用。bash
curl -v https://www.example.com -
-I
/--head
: 只获取 HTTP 头部信息,不下载页面内容。常用于检查 URL 是否可访问、获取文件大小、修改时间等信息。bash
curl -I https://www.example.com
2. 处理 HTTP 请求
curl
最常用的场景是与 Web 服务器进行 HTTP/HTTPS 交互。以下参数专门用于控制 HTTP 请求:
-
-X <method>
/--request <method>
: 指定 HTTP 请求方法。默认为 GET。你可以指定 POST, PUT, DELETE 等方法。bash
curl -X POST https://api.example.com/users -
-d <data>
/--data <data>
: 发送 POST 请求的数据体。常用于提交表单或发送 JSON 数据。使用-d
时,curl
会自动将请求方法设置为 POST,除非你用-X
显式指定了其他方法。数据会作为application/x-www-form-urlencoded
类型发送,除非你设置了Content-Type
头。“`bash
发送表单数据
curl -d “username=test&password=123456” https://api.example.com/login
发送 JSON 数据 (需要设置 Content-Type 头)
curl -X POST -H “Content-Type: application/json” -d ‘{“name”: “Alice”, “age”: 30}’ https://api.example.com/users
“` -
-H <header>
/--header <header>
: 添加自定义请求头。可以设置多个-H
选项来添加多个头。“`bash
设置 Content-Type 和 Authorization 头
curl -H “Content-Type: application/json” -H “Authorization: Bearer your_token” https://api.example.com/data
“` -
-A <string>
/--user-agent <string>
: 设置 User-Agent 头。默认情况下,curl
会发送一个包含 “curl” 字样的 User-Agent。“`bash
模拟浏览器访问
curl -A “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36” https://www.example.com
“` -
--referer <URL>
: 设置 Referer 头,表示请求是从哪个页面链接过来的。bash
curl --referer https://www.google.com https://www.example.com/download -
-b <name=value>
/--cookie <name=value>
: 发送指定的 cookie。也可以指定一个文件,curl
会从文件中读取 cookie。“`bash
发送单个 cookie
curl -b “sessionid=abcdef123456” https://www.example.com/profile
从文件中读取 cookie
curl -b cookies.txt https://www.example.com
“` -
-c <file>
/--cookie-jar <file>
: 在请求完成后,将所有 cookie 保存到指定的文件中。常用于登录后保存 session cookie。“`bash
登录并保存 cookie
curl -c cookies.txt -d “username=test&password=123” https://www.example.com/login
使用保存的 cookie 访问其他页面
curl -b cookies.txt https://www.example.com/dashboard
“` -
-L
/--location
: 当服务器返回重定向(如 301, 302 状态码)时,curl
会自动跟踪重定向直到最终资源。bash
curl -L http://short.url/resource
3. 处理 SSL/TLS 安全连接
curl
在处理 HTTPS 等安全协议时非常强大,但也可能遇到证书问题。
-
-k
/--insecure
: 允许curl
连接到没有有效 SSL/TLS 证书的站点。例如,证书过期、域名不匹配或自签名证书。请注意,这会禁用证书验证,存在安全风险,仅应在测试或受信任的环境中使用。“`bash
忽略证书错误访问自签名证书的站点
curl -k https://internal.server.local
“` -
--cacert <file>
: 指定用于验证服务器证书的 CA 证书文件(PEM 格式)。bash
curl --cacert my_ca.pem https://secure.example.com -
--cert <file>
/--key <file>
: 指定客户端证书和私钥文件,用于客户端身份验证。bash
curl --cert client.pem --key client.key https://secure.example.com/protected
4. 控制传输过程
-
-C <offset>
/--continue-at <offset>
: 断点续传。如果下载中断,可以使用-C -
来继续下载。curl
会自动检测已下载部分并从断点开始。“`bash
中断后继续下载
curl -C – -O https://large.file.com/bigfile.zip
“` -
--limit-rate <speed>
: 限制数据传输速率。可以使用 K, M, G 后缀表示 KB/s, MB/s, GB/s。“`bash
将下载速度限制在 100 KB/s
curl –limit-rate 100K -O https://large.file.com/bigfile.zip
“` -
-T <file>
/--upload-file <file>
: 上传文件到指定的 URL。通常用于 FTP 或使用 PUT 方法进行 HTTP 上传。“`bash
使用 PUT 方法上传文件
curl -T localfile.txt https://webdav.example.com/remote/path/localfile.txt
使用 FTP 上传
curl -T localfile.txt ftp://ftp.example.com/upload/
“`
5. 身份验证
-
-u <user:password>
/--user <user:password>
: 指定用户名和密码进行服务器身份验证。默认使用 Basic 认证。“`bash
Basic 认证
curl -u admin:password123 https://protected.example.com/data
“` -
--basic
/--digest
/--negotiate
/--ntlm
: 显式指定 HTTP 身份验证方法。“`bash
Digest 认证
curl –digest -u admin:password123 https://protected.example.com/data
“` -
-E <certificate[:password]>
/--cert <certificate[:password]>
: 指定客户端证书文件进行身份验证(见 SSL/TLS 部分)。
6. 配置代理
-
-x <host>:<port>
/--proxy <host>:<port>
: 通过指定的代理服务器进行连接。“`bash
使用 HTTP 代理
curl -x http://myproxy.com:8080 https://www.example.com
使用 SOCKS5 代理
curl -x socks5://myproxy.com:1080 https://www.example.com
“` -
-U <user:password>
/--proxy-user <user:password>
: 为代理服务器指定用户名和密码。bash
curl -x http://myproxy.com:8080 -U proxyuser:proxypassword https://www.example.com
7. 其他实用参数
-
-F <name=content>
/--form <name=content>
: 发送 multipart/form-data 类型的 POST 请求。常用于模拟 HTML 表单提交,包括文件上传。“`bash
模拟上传文件
curl -F “username=test” -F “profile_picture=@path/to/image.jpg” https://www.example.com/upload
“`这里的
@path/to/image.jpg
表示读取本地文件path/to/image.jpg
作为profile_picture
字段的内容。 -
--connect-timeout <seconds>
: 设置连接超时时间。如果在这个时间内无法建立连接,curl
会终止。bash
curl --connect-timeout 5 https://slow-server.com -
--max-time <seconds>
: 设置整个操作的最大允许时间(从开始连接到结束传输)。bash
curl --max-time 10 -O https://slow-server.com/largefile.zip -
-Z
/--parallel
: 实验性参数,允许并行传输多个 URL。bash
curl -Z -O http://example.com/file1.zip -O http://example.com/file2.zip -
-w <format>
/--write-out <format>
: 在请求完成后,以指定格式输出额外信息。这对于自动化脚本和监控非常有用。格式字符串中可以使用各种变量(如%{http_code}
,%{time_total}
,%{size_download}
, etc.)。“`bash
输出 HTTP 状态码和总耗时
curl -s -w “%{http_code} %{time_total}\n” https://www.example.com
结合其他参数检查网站健康状态
curl -s -o /dev/null -w “%{http_code}” https://www.example.com
结果是 200 表示正常,其他表示错误
“`
实用示例
下面通过一些综合示例来展示 curl
在实际应用中的强大之处。
示例 1: 下载文件并显示进度
bash
curl -O -# https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.5.tar.xz
-O
: 根据远程文件名保存。-#
: 显示进度条。
示例 2: 测试 REST API – GET 请求并查看详细信息
bash
curl -v https://jsonplaceholder.typicode.com/posts/1
-v
: 显示请求和响应的所有详细信息,包括头信息。
示例 3: 测试 REST API – POST 请求发送 JSON 数据
bash
curl -X POST \
-H "Content-Type: application/json" \
-d '{"title": "foo", "body": "bar", "userId": 1}' \
https://jsonplaceholder.typicode.com/posts
-X POST
: 指定 POST 方法。-H "Content-Type: application/json"
: 设置请求头,告诉服务器数据是 JSON 格式。-d '{"title": "foo", "body": "bar", "userId": 1}'
: 发送 JSON 数据作为请求体。注意单引号的使用,以避免 shell 对特殊字符进行解释。
示例 4: 模拟用户登录并访问需要认证的页面
假设登录接口返回了 Set-Cookie 头,需要在后续请求中使用。
“`bash
1. 登录并保存 cookie 到文件
curl -c my_cookies.txt -d “username=myuser&password=mypass” https://example.com/login
2. 使用保存的 cookie 访问个人中心
curl -b my_cookies.txt https://example.com/profile
“`
-c my_cookies.txt
: 将登录成功后服务器返回的 cookie 保存到my_cookies.txt
文件。-b my_cookies.txt
: 在访问/profile
时,从my_cookies.txt
文件中读取 cookie 并发送给服务器。
示例 5: 使用 Basic 认证访问受保护资源
bash
curl -u myuser:mypassword https://protected.example.com/data
-u myuser:mypassword
: 提供用户名和密码进行 Basic 认证。
示例 6: 通过代理访问网站
bash
curl -x http://proxy.company.com:8080 https://www.google.com
-x http://proxy.company.com:8080
: 指定代理服务器地址和端口。
示例 7: 检查一个 URL 是否重定向以及最终地址
bash
curl -I -L http://goo.gl/xxxxxx
-I
: 只获取头部信息。-L
: 跟踪重定向。curl
会显示每次重定向的头部信息以及最终地址的头部信息。
示例 8: 上传文件到 FTP 服务器
bash
curl -u ftpuser:ftppassword -T localfile.txt ftp://ftp.example.com/upload/remote_filename.txt
-u ftpuser:ftppassword
: FTP 用户名和密码。-T localfile.txt
: 指定要上传的本地文件。ftp://...
: FTP 目标路径。
示例 9: 获取 HTTP 状态码
bash
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.com
-s
: 静默模式,不输出页面内容和进度信息。-o /dev/null
: 将输出内容重定向到空设备,丢弃页面内容。-w "%{http_code}\n"
: 在请求完成后输出 HTTP 状态码,并在后面加上换行符。
更多高级用法
- 从文件读取数据:
-d @filename
可以读取本地文件内容作为 POST 数据发送。这对于发送大型 JSON 或 XML 数据非常有用。 - 配置文件的使用:
-K <configfile>
或--config <configfile>
可以从配置文件中读取curl
选项。这有助于管理复杂的命令或敏感信息(如密码,但仍需注意文件权限)。 - Progress Meter:
--progress-bar
提供一个更直观的文本进度条。 - 错误处理:
curl
的退出状态码可以用于脚本中判断命令是否成功。例如,0
通常表示成功。
注意事项
- 安全性: 在命令行中直接输入敏感信息(如密码)可能会被记录在 shell 历史中。对于生产环境或敏感操作,考虑使用配置文件 (
-K
)、环境变量或其他更安全的方式来传递认证信息。避免在不可信的网络中使用-k
。 - 数据编码: 使用
-d
发送数据时,curl
默认使用application/x-www-form-urlencoded
编码。如果发送其他类型数据(如 JSON),务必使用-H "Content-Type: ..."
指定正确的编码类型。 - Shell 引用: 当参数值包含特殊字符(如空格、
&
、?
、{
、}
等)时,务必使用引号(单引号或双引号)将其括起来,以防止 shell 解释。
总结
curl
是一个极其灵活和强大的网络工具,其功能远不止本文介绍的这些。通过熟练掌握其核心参数,你可以轻松应对各种网络数据传输任务,无论是简单的文件下载,还是复杂的 API 交互和网络调试。当遇到特定需求时,查阅 man curl
或 curl --help
将是你进一步探索其深层功能的最佳途径。希望本文能帮助你更好地理解和使用 curl
这把网络世界的瑞士军刀。