Curl 命令入门指南 – wiki基地


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 curlsudo 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 POSTcurl 会自动将方法改为 POST。

    “`bash

    发送表单数据

    curl -d “name=test&age=30” https://api.example.com/submit
    ``
    这会发送一个 POST 请求,请求体为
    name=test&age=30Content-Type默认为application/x-www-form-urlencoded`。

    “`bash

    发送原始字符串数据

    curl -d “Just some plain text data” https://api.example.com/submit_text
    ``
    这会发送一个 POST 请求,请求体为
    Just some plain text data`。

  • -d @[文件名]: 从文件中读取数据作为 POST 请求体。

    “`bash

    假设有一个 data.json 文件

    内容为 {“username”:”admin”, “password”:”secret”}

    curl -X POST -d @data.json https://api.example.com/login
    ``
    这会发送一个 POST 请求,请求体内容来自
    data.json` 文件。

  • --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-TypeSet-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 愉快!


发表评论

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

滚动至顶部