`curl` 命令参数详解及实用示例 – wiki基地


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 curlcurl --help 将是你进一步探索其深层功能的最佳途径。希望本文能帮助你更好地理解和使用 curl 这把网络世界的瑞士军刀。


发表评论

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

滚动至顶部