掌握 curl 命令:从入门到精通 – wiki基地

掌握 curl 命令:从入门到精通

curl 是一个功能强大的命令行工具,用于传输数据,支持多种协议,包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、DICT、TELNET、LDAP、LDAPS、FILE、POP3、POP3S、IMAP、IMAPS、SMTP、SMTPS、RTMP 和 RTSP。它通常用于测试 API、下载文件、上传数据以及与 Web 服务器进行交互。本文将带你从 curl 的基础用法开始,逐步深入到其高级功能和最佳实践。

1. curl 简介

curl 的全称是 “Client for URLs”,它是一个开源项目,由 Daniel Stenberg 开发。它的主要特点是:

  • 多协议支持:支持几乎所有主流的网络传输协议。
  • 跨平台:可在 Linux、macOS、Windows 等多种操作系统上运行。
  • 灵活性:提供了大量的选项,可以精细控制数据传输的各个方面。
  • 脚本友好:非常适合在 shell 脚本中进行自动化操作。

2. curl 的基本用法

2.1. 获取网页内容

最基本的用法是获取指定 URL 的内容,并将其输出到标准输出(终端)。

bash
curl https://example.com

2.2. 将输出保存到文件

使用 -o (小写 o) 选项可以将 curl 获取的内容保存到指定文件中。

bash
curl -o example.html https://example.com

使用 -O (大写 O) 选项可以根据 URL 中的文件名自动保存文件。

bash
curl -O https://example.com/image.jpg

2.3. 显示响应头信息

使用 -i 选项可以显示 HTTP 响应头以及页面内容。

bash
curl -i https://example.com

如果只想看响应头,可以使用 -I (大写 I) 选项,它会发送一个 HEAD 请求。

bash
curl -I https://example.com

2.4. 发送 POST 请求

curl 默认发送 GET 请求。要发送 POST 请求,可以使用 -X POST 选项,并通过 -d 选项传递数据。

发送表单数据 (application/x-www-form-urlencoded):

bash
curl -X POST -d "param1=value1&param2=value2" https://example.com/api/submit

发送 JSON 数据 (application/json):

需要设置 Content-Type 头。

bash
curl -X POST -H "Content-Type: application/json" -d '{"key1": "value1", "key2": "value2"}' https://example.com/api/data

3. curl 的高级功能

3.1. 自定义请求头

使用 -H 选项可以添加自定义的 HTTP 请求头。这对于 API 调用、身份验证等场景非常有用。

bash
curl -H "User-Agent: MyCustomAgent/1.0" -H "Accept-Language: zh-CN" https://example.com

3.2. 身份验证

3.2.1. 基本认证 (Basic Authentication)

使用 -u 选项提供用户名和密码。

bash
curl -u "username:password" https://api.example.com/protected

3.2.2. Digest 认证

对于 Digest 认证,也使用 -u 选项,并加上 --digest

bash
curl --digest -u "username:password" https://api.example.com/protected

3.3. 处理 Cookies

3.3.1. 发送 Cookies

使用 -b 选项发送 Cookie。

bash
curl -b "name=value; name2=value2" https://example.com/dashboard

也可以从文件中读取 Cookie。

bash
curl -b cookies.txt https://example.com/dashboard

3.3.2. 保存 Cookies

使用 -c 选项将服务器返回的 Cookie 保存到文件中。

bash
curl -c cookies.txt https://example.com/login

3.4. 使用代理

使用 -x--proxy 选项指定代理服务器。

bash
curl -x http://proxy.example.com:8080 https://example.com

对于需要认证的代理:

bash
curl -x http://user:[email protected]:8080 https://example.com

3.5. 设置超时

使用 --connect-timeout 设置连接超时时间,--max-time 设置整个传输过程的最大时间。

bash
curl --connect-timeout 5 --max-time 10 https://example.com

3.6. 跟踪重定向

curl 默认不跟踪 HTTP 3xx 重定向。使用 -L 选项可以使其跟踪重定向。

bash
curl -L http://shorturl.at/abcde

3.7. 文件上传

3.7.1. 使用 POST 上传文件 (multipart/form-data)

使用 -F 选项模拟表单文件上传。

bash
curl -F "file=@/path/to/local/file.txt" -F "param1=value1" https://example.com/upload

3.7.2. 使用 PUT 上传文件

使用 -T 选项上传文件到指定 URL。

bash
curl -T /path/to/local/file.txt ftp://ftp.example.com/remote/path/file.txt

3.8. 调试与详细输出

3.8.1. 详细模式

使用 -v 选项可以显示详细的请求和响应过程,包括连接信息、请求头、响应头等。

bash
curl -v https://example.com

3.8.2. 静默模式

使用 -s 选项可以抑制 curl 的进度条和错误信息,只输出最终数据。

bash
curl -s https://example.com

结合 -S (大写 S) 可以静默进度条,但显示错误信息。

bash
curl -sS https://example.com/nonexistent

4. curl 的最佳实践

4.1. 安全考虑

  • HTTPS 优先:始终优先使用 HTTPS 协议,以保护数据传输的安全性。
  • 证书验证curl 默认会验证 SSL/TLS 证书。如果遇到自签名证书或测试环境,可以使用 -k--insecure 选项禁用证书验证,但在生产环境中应避免使用此选项
    bash
    curl -k https://self-signed.example.com
  • 敏感信息:避免在命令行中直接暴露敏感信息(如密码),尤其是在共享终端或脚本中。可以考虑使用环境变量或从文件中读取。

4.2. 错误处理

在脚本中使用 curl 时,检查其退出状态码非常重要。curl 在成功时返回 0,失败时返回非零值。

bash
if curl -sS -o /dev/null https://example.com; then
echo "Website is reachable."
else
echo "Website is not reachable."
fi

4.3. 在脚本中使用 curl

  • 静默模式:在脚本中通常使用 -s-sS 来避免不必要的输出。
  • 输出重定向:将输出重定向到文件或变量,而不是直接打印到终端。
  • 错误日志:将错误信息重定向到日志文件,以便后续分析。

4.4. 常用组合

  • 下载文件并显示进度
    bash
    curl -L -O --progress-bar https://example.com/large_file.zip
  • 测试 API 连通性
    bash
    curl -sS -o /dev/null -w "%{http_code}\n" https://api.example.com/health

    这里的 -w "%{http_code}\n" 会在请求完成后打印 HTTP 状态码。

5. 总结

curl 是一个极其强大和灵活的工具,掌握它能极大地提高你在网络调试、API 交互和自动化任务中的效率。从简单的网页抓取到复杂的认证和文件上传,curl 都能胜任。通过不断实践和探索其丰富的选项,你将能够充分发挥 curl 的潜力。

滚动至顶部