Curl 命令入门指南:连接互联网的瑞士军刀
互联网是数据海洋,我们每天都在其中遨游。网页浏览、文件下载、API 调用……所有这些操作背后,都是数据在不同计算机之间的传输。有没有一个命令行工具,可以让我们直接与互联网进行“对话”,发送请求,接收数据,甚至模拟浏览器行为?答案就是 curl
。
curl
是一个功能强大的命令行工具,用于使用各种协议(如 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、DICT、TELNET、LDAP、LDAPS、POP3、POP3S、IMAP、IMAPS、SMTP、SMTPS、RTMP、RTSP、GOPHER、FILE)传输数据。对于开发者、系统管理员、网络工程师,甚至是普通用户来说,掌握 curl
都是非常有益的。它可以用来测试网络连接、下载文件、与 Web 服务交互、调试 API 等等。
本指南将带你从零开始,逐步了解 curl
的基本用法和常用选项,让你能够利用它来完成各种网络任务。
1. Curl 是什么?为什么使用它?
简单来说,curl
是一个用来传输数据的命令行工具。你可以把它想象成一个没有图形界面的浏览器,或者一个能够理解多种网络协议的通用文件传输工具。
为什么使用 curl
?
- 跨平台:
curl
几乎可以在所有操作系统上运行(Linux, macOS, Windows)。 - 功能强大: 支持丰富的协议,可以完成复杂的网络任务。
- 无需图形界面: 可以在服务器上、脚本中方便地使用,尤其适合自动化任务。
- 高度可定制: 提供大量选项,可以精确控制请求和响应的每一个细节。
- 常用于调试: 开发者经常使用
curl
来测试 API、检查 HTTP 头信息、模拟各种请求场景。
2. 安装 Curl
在大多数现代操作系统上,curl
已经预装。
- Linux/macOS: 打开终端,输入
curl --version
。如果显示版本信息,说明已经安装。如果未安装,在 Debian/Ubuntu 系统上可以使用sudo apt update && sudo apt install curl
安装,在 Fedora/CentOS/RHEL 系统上使用sudo yum install curl
或sudo dnf install curl
安装,在 macOS 上使用 Homebrew 可以通过brew install curl
安装(通常系统自带的已足够)。 - Windows: 在 Windows 10 或更高版本中,
curl
通常已预装在系统中。你可以在命令提示符或 PowerShell 中输入curl --version
检查。如果未安装,可以从curl
官网(curl.se)下载安装包。
3. Curl 的基本用法:获取网页内容
curl
最简单的用法就是获取一个 URL 的内容。
bash
curl [URL]
例如,获取百度首页的内容:
bash
curl https://www.baidu.com
执行这个命令后,curl
会向 https://www.baidu.com
发送一个 HTTP GET 请求,并将服务器返回的整个 HTML 内容打印到终端。你会看到一大堆 HTML 代码,这就是百度首页的源代码。
这类似于你在浏览器中右键点击“查看页面源代码”所看到的内容,但是 curl
默认不会渲染页面,只是获取原始数据。
4. 理解核心概念:URL, 协议, 请求, 响应
在使用 curl
时,了解一些基本概念很重要:
- URL (统一资源定位符): 指明了要访问的资源的位置和方式。例如:
https://www.example.com/path/to/resource.html
。https://
: 协议 (这里是安全的超文本传输协议)。www.example.com
: 主机名 (服务器地址)。/path/to/resource.html
: 路径 (服务器上的具体资源)。
- 协议 (Protocol): 定义了数据传输的规则。
curl
支持多种协议,最常用的是 HTTP (用于网页) 和 HTTPS (HTTP 的安全版本)。 - 请求 (Request): 客户端(比如
curl
)向服务器发送的访问资源的指令。一个请求通常包含:- HTTP 方法: 告诉服务器想做什么(GET, POST, PUT, DELETE 等)。
- URL: 想访问哪个资源。
- 请求头 (Headers): 提供了关于请求的附加信息(如客户端类型、接受的数据格式、认证信息等)。
- 请求体 (Body): 对于 POST 或 PUT 请求,通常包含要发送给服务器的数据。
- 响应 (Response): 服务器接收到请求后,返回给客户端的结果。一个响应通常包含:
- 状态码 (Status Code): 一个数字,表示请求的处理结果(如 200 OK, 404 Not Found, 500 Internal Server Error 等)。
- 响应头 (Headers): 提供了关于响应的附加信息(如数据类型、内容长度、服务器信息等)。
- 响应体 (Body): 请求的资源内容(如 HTML 页面、JSON 数据、图片文件等)。
curl
的各种选项就是用来控制这些请求和响应的细节。
5. Curl 常用选项详解
curl
提供了数百个选项,但对于初学者来说,掌握其中一些最常用的就足够应对大部分场景了。
5.1 下载文件
默认情况下,curl
会将获取的内容直接输出到标准输出(终端)。如果你想将内容保存到文件,可以使用 -o
或 -O
选项。
-
-o [文件名]
(小写 o): 将输出保存到指定的文件名。bash
curl -o baidu.html https://www.baidu.com
执行后,百度首页的 HTML 内容会被保存到当前目录下的baidu.html
文件中。 -
-O
(大写 O): 根据 URL 中的文件名自动保存文件。这对于下载文件非常方便。bash
curl -O https://raw.githubusercontent.com/curl/curl/master/README.md
这个命令会从指定的 URL 下载文件,并将其保存为当前目录下的README.md
文件。
5.2 显示下载进度
当你下载大文件时,默认的 curl
可能会显示一个进度条。但有时你需要更详细或更简洁的输出。
-
-#
: 显示一个简单的进度条。bash
curl -# -O https://speed.hetzner.de/100MB.bin
这个命令会下载一个 100MB 的测试文件,并显示一个由#
组成的进度条。 -
-s
或--silent
: 静默模式,不显示任何进度或错误信息(除非出错)。bash
curl -s -O https://raw.githubusercontent.com/curl/curl/master/README.md
下载过程不会有任何输出,只会在完成后看到文件出现在当前目录。 -
-v
或--verbose
: 显示非常详细的通信过程信息,包括请求头、响应头、连接信息等。这对于调试非常有用。bash
curl -v https://www.example.com
你会看到>
开头的行表示请求信息,<
开头的行表示响应信息。
5.3 处理重定向
很多网站在访问时会发生重定向,比如从 http://example.com
重定向到 https://www.example.com
。默认情况下,curl
不会自动跟踪这些重定向,它只会获取原始 URL 返回的重定向信息。
-
-L
或--location
: 跟踪重定向,直到到达最终目标 URL。bash
curl http://github.com
这个命令会显示一个 301 或 302 重定向到https://github.com
的信息。bash
curl -L http://github.com
这个命令会跟踪重定向,直接获取https://github.com
的内容。
5.4 指定 HTTP 方法
默认情况下,curl
使用 GET 方法发送请求。但与 Web 服务交互时,经常需要使用 POST、PUT、DELETE 等其他方法。
-
-X [方法名]
或--request [方法名]
: 指定使用的 HTTP 方法。“`bash
发送一个 POST 请求
curl -X POST https://api.example.com/users
“`
这个命令发送一个方法为 POST 的请求,但不包含任何数据体。通常 POST 请求需要发送数据,这会在下一节介绍。“`bash
发送一个 DELETE 请求
curl -X DELETE https://api.example.com/users/123
“`
5.5 发送数据 (POST, PUT 等)
对于 POST 或 PUT 请求,通常需要将数据发送给服务器。
-
-d [数据]
或--data [数据]
: 发送 POST 请求,并包含指定的数据。数据可以是key=value
格式,也可以是原始字符串。使用-d
时,如果未指定-X POST
,curl
会自动将方法改为 POST。“`bash
发送表单数据
curl -d “name=test&age=30” https://api.example.com/submit
``
name=test&age=30
这会发送一个 POST 请求,请求体为,
Content-Type默认为
application/x-www-form-urlencoded`。“`bash
发送原始字符串数据
curl -d “Just some plain text data” https://api.example.com/submit_text
``
Just some plain text data`。
这会发送一个 POST 请求,请求体为 -
-d @[文件名]
: 从文件中读取数据作为 POST 请求体。“`bash
假设有一个 data.json 文件
内容为 {“username”:”admin”, “password”:”secret”}
curl -X POST -d @data.json https://api.example.com/login
``
data.json` 文件。
这会发送一个 POST 请求,请求体内容来自 -
--data-urlencode [数据]
: 发送 POST 请求,并对数据进行 URL 编码。对于包含特殊字符的数据很有用。bash
curl --data-urlencode "message=Hello World!" https://api.example.com/send_message
这会发送一个 POST 请求,请求体可能变成message=Hello%20World%21
。 -
-F [name=value]
或--form [name=value]
: 发送multipart/form-data
格式的 POST 请求,常用于文件上传。“`bash
上传文件 file.txt
curl -F “file=@/path/to/file.txt” https://api.example.com/upload
``
@符号告诉
curl@/path/to/file.txt` 是一个文件路径,而不是字面值。
5.6 设置请求头
HTTP 请求头用于向服务器提供关于请求或客户端的附加信息。
-
-H "[Header]: [Value]"
或--header "[Header]: [Value]"
: 设置一个自定义请求头。“`bash
设置 Content-Type 为 application/json
curl -H “Content-Type: application/json” -X POST -d ‘{“name”:”test”}’ https://api.example.com/create
“`
这对于与需要 JSON 数据作为输入的 API 交互非常重要。“`bash
设置 User-Agent
curl -H “User-Agent: MyCurlClient/1.0” https://www.example.com
“`
模拟不同的客户端访问。“`bash
发送认证 Token
curl -H “Authorization: Bearer your_access_token” https://api.example.com/resource
“`
5.7 查看响应头
有时你只关心服务器返回的响应头,比如状态码、Content-Type
、Set-Cookie
等信息,而不需要响应体。
-
-I
或--head
: 只发送 HEAD 请求,服务器只会返回响应头,不会返回响应体。bash
curl -I https://www.google.com
这个命令只会显示谷歌首页的响应头信息,非常快速。结合
-v
可以查看请求头和响应头:bash
curl -v https://www.google.com
虽然会显示更多信息,但对于初学者理解请求/响应过程更有帮助。-I
更适合快速检查头部信息。
5.8 处理 Cookies
网站经常使用 Cookie 来跟踪用户状态。curl
也可以处理 Cookie。
-c [文件名]
或--cookie-jar [文件名]
: 将服务器设置的 Cookie 保存到指定文件。-
-b [文件名或字符串]
或--cookie [文件名或字符串]
: 从指定文件读取 Cookie 并发送到服务器,或直接发送指定的 Cookie 字符串。“`bash
访问网站,并将 Cookie 保存到 cookies.txt
curl -c cookies.txt https://www.example.com
“`“`bash
再次访问网站,并发送之前保存的 Cookie
curl -b cookies.txt https://www.example.com/profile
“`“`bash
直接发送 Cookie 字符串
curl -b “sessionid=abcdef123456; csrftoken=xyz789” https://api.example.com/data
“`
5.9 模拟浏览器行为 (User Agent 和 Referer)
有时,服务器会根据请求头中的 User-Agent
(客户端标识) 或 Referer
(来源页面) 来调整响应。你可以使用 curl
模拟这些头信息。
-
-A "[User-Agent]"
或--user-agent "[User-Agent]"
: 设置 User-Agent 头。bash
curl -A "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
模拟 Chrome 浏览器访问。 -
-e "[Referer]"
或--referer "[Referer]"
: 设置 Referer 头。bash
curl -e "https://www.google.com" https://www.example.com/somepage
模拟从谷歌搜索结果页点击链接访问。
5.10 忽略 SSL/TLS 证书错误 (小心使用!)
在访问使用 HTTPS 但证书有问题(自签名、过期等)的网站时,curl
默认会拒绝连接。如果你确定要继续,可以使用 -k
。
-
-k
或--insecure
: 允许curl
连接到没有有效 SSL/TLS 证书的服务器。bash
curl -k https://badssl.com/
警告: 在生产环境或不信任的网络上使用-k
非常危险,因为它会让你容易受到中间人攻击。只在你知道自己在做什么时使用。
5.11 设置请求超时
有时请求可能因为网络问题或服务器响应慢而长时间挂起。你可以设置一个超时时间。
-
-m [秒数]
或--max-time [秒数]
: 设置整个传输过程允许的最长总时间(秒)。bash
curl -m 10 https://slow-responding-site.com
如果10秒内没有完成传输,curl
将终止并报错。
6. 实践:结合选项完成任务
掌握了这些基本选项后,你可以将它们组合起来完成更复杂的任务。
示例 1: 下载一个文件,跟踪重定向,显示进度
bash
curl -L -O -# https://download.example.com/latest.zip
这个命令会跟踪 https://download.example.com/latest.zip
的重定向(-L
),根据 URL 中的文件名保存文件(-O
),并在下载过程中显示进度条(-#
)。
示例 2: 向 API 发送带 JSON 数据的 POST 请求,并显示详细信息
bash
curl -v -X POST -H "Content-Type: application/json" -d '{"username":"newuser", "email":"[email protected]"}' https://api.example.com/register
这个命令会:
* 显示详细的请求和响应过程(-v
)。
* 使用 POST 方法(-X POST
)。
* 设置 Content-Type
头为 application/json
(-H "Content-Type: application/json"
)。
* 发送 JSON 数据作为请求体(-d '{"username":"newuser", "email":"[email protected]"}'
)。
* 请求的目标是 https://api.example.com/register
。
通过 -v
的输出,你可以看到发送的请求头、请求体,以及服务器返回的状态码、响应头和响应体,这对于调试 API 调用非常有用。
示例 3: 获取一个页面内容,保存到文件,并模拟浏览器访问
bash
curl -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15" -e "https://www.google.com/search?q=example" -o example_page.html https://www.example.com/some_article
这个命令会:
* 模拟一个 macOS Safari 浏览器访问(-A ...
)。
* 模拟从谷歌搜索结果页跳转过来(-e ...
)。
* 将获取的页面内容保存到 example_page.html
文件(-o example_page.html
)。
* 请求的目标是 https://www.example.com/some_article
。
7. 常见问题与故障排除
- 网络问题: 如果出现连接错误,首先检查你的网络连接是否正常,目标网站是否可访问(可以尝试 ping 或在浏览器中访问)。
- 404 Not Found: 资源未找到。检查 URL 是否正确。
- 403 Forbidden: 无权访问。可能是需要认证、Cookie、正确的 User-Agent 或 Referer。
- 5xx Internal Server Error: 服务器端错误。问题在服务器端,你通常无能为力,只能等待服务器修复。
- SSL 证书错误: 尝试使用
-k
(但不推荐,除非你知道原因)。 - 输出太多/乱码: 确保你的终端支持 UTF-8 编码。如果输出是压缩的(如 gzip),
curl
默认会自动解压,但如果不是,你可能需要其他工具处理。 - 不知道为什么出错: 使用
-v
选项。详细的输出会告诉你请求发送了什么,服务器返回了什么,以及在哪里出了问题。
8. 进一步学习
本指南只涵盖了 curl
的基础和常用功能。curl
还有许多其他强大的特性,例如:
- FTP/SFTP 等协议: 下载和上传文件到 FTP/SFTP 服务器。
- 认证: 使用
-u
进行基本认证。 - 代理: 使用
-x
通过代理服务器访问。 - 限速: 使用
--limit-rate
控制下载速度。 - 多部分传输: 使用
--range
下载文件的一部分。 - 继续下载: 使用
-C -
从中断的地方继续下载。
要了解所有这些功能,最好的资源是 curl
的官方文档和帮助页:
- 在终端输入
man curl
查看本地手册页。 - 输入
curl --help
查看简要帮助信息。 - 访问
curl
官方网站 (curl.se) 查看详细文档。
9. 总结
curl
是一个极其灵活和强大的命令行工具,它是每个与网络交互的计算机用户的必备工具之一。通过本指南的学习,你应该已经掌握了 curl
的基本概念和常用选项,能够使用它来获取网页内容、下载文件、与 Web API 交互以及进行简单的网络调试。
从现在开始,尝试在你的日常工作中使用 curl
吧!你会发现它能极大地提高你的效率,并帮助你更深入地理解网络通信的原理。不断实践和探索,你会发现 curl
的更多强大之处。
祝你使用 curl
愉快!