掌握 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¶m2=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 的潜力。