Curl 命令行工具:详解与实用技巧
curl(Client URL)是一个功能极其强大且用途广泛的命令行工具和库,用于通过 URL 传输数据。它支持多种协议,包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、SMB/CIFS 等等,是开发者、系统管理员以及任何需要从命令行与网络资源交互的用户的必备利器。curl 因其卓越的多功能性、简洁的命令行接口以及强大的自动化能力而广受欢迎,常被用于测试 API、下载文件、上传数据、调试网络问题,甚至可以进行复杂的网站抓取。
基本用法
curl 最简单的用法是获取指定 URL 的内容。默认情况下,curl 会执行一个 HTTP GET 请求,并将服务器的响应内容(通常是 HTML 源代码)输出到标准输出(即您的终端)。
示例:获取网页内容
bash
curl https://example.com
执行此命令后,您将看到 https://example.com 网页的 HTML 源代码在终端中显示。
常用 curl 选项详解
curl 提供了数百个选项来精细控制其行为。掌握这些常用选项能够极大地提高您使用 curl 的效率和灵活性。
1. 保存输出到文件:-o (小写 O) 与 -O (大写 O)
这两个选项用于将 curl 的输出保存到文件中,而不是直接显示在终端。
-
-o <文件名>:将curl的输出保存到您指定的文件名。
bash
curl -o homepage.html https://example.com
这会将example.com的 HTML 内容保存到当前目录下的homepage.html文件中。 -
-O:使用远程文件的原始名称保存下载的文件。
bash
curl -O https://example.com/images/logo.png
如果https://example.com/images/logo.png存在,curl会将其保存为当前目录下的logo.png。
2. 跟随重定向:-L / --location
在网络请求中,服务器可能会发送重定向响应(例如 301 Moved Permanently, 302 Found)。默认情况下,curl 不会跟随这些重定向。使用 -L 选项可以指示 curl 自动跟随重定向,最多可达 30 次,以防止无限循环。
bash
curl -L http://shorturl.at/fptx2
这个命令会跟随短链接的重定向,最终获取到目标页面的内容。
注意:对于 POST 请求,如果服务器响应 301、302 或 303 状态码,curl -L 默认会将后续请求方法更改为 GET。如果需要保持 POST 方法,可以使用 --post301、--post302 或 --post303 选项。
3. 仅显示 HTTP 头部:-I (大写 I) / --head
此选项会发送一个 HEAD 请求而不是 GET 请求,只检索 HTTP 响应头,而不下载实际内容。这对于快速检查服务器状态、内容类型或调试非常有用。
bash
curl -I https://example.com
您将看到类似 HTTP/1.1 200 OK、Content-Type: text/html 等响应头信息。
4. 在输出中包含响应头部:-i (小写 i) / --include
此选项会在终端输出中同时显示 HTTP 响应头和响应体。这对于调试时查看完整的 HTTP 交互很有帮助。
bash
curl -i https://example.com
您会先看到响应头,然后是网页的 HTML 内容。
5. 指定请求方法:-X <方法> / --request <方法>
用于指定 HTTP 请求方法,例如 GET、POST、PUT、DELETE 等。
bash
curl -X POST https://api.example.com/data
此命令将向 https://api.example.com/data 发送一个 POST 请求。
6. 发送数据:-d <数据> / --data <数据>
此选项用于在 POST、PUT 等请求中发送数据。如果未明确指定 -X POST,单独使用 -d 会自动将请求方法设置为 POST。
发送表单数据:
bash
curl -d "param1=value1¶m2=value2" https://api.example.com/submit
发送 JSON 数据:
发送 JSON 数据时,通常需要设置 Content-Type 头部。
bash
curl -X POST -H "Content-Type: application/json" -d '{"key":"value", "name":"test"}' https://api.example.com/json
您也可以从文件中读取 JSON 数据,这对于大型 JSON 数据或需要参数化的场景非常方便:
“`bash
data.json 文件内容:{“key”:”value”}
curl -X POST -H “Content-Type: application/json” -d @data.json https://api.example.com/json
“`
7. 添加自定义头部:-H <头部> / --header <头部>
允许您添加自定义 HTTP 头部,例如 Authorization、Content-Type、User-Agent 或其他自定义信息。可以多次使用 -H 来添加多个头部。
bash
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" -H "Accept: application/json" https://api.example.com/protected
8. 身份验证:-u <用户:密码> / --user <用户:密码>
用于发送基本 HTTP 身份验证凭据。
bash
curl -u "username:password" https://api.example.com/secure
重要提示:基本身份验证以 Base64 编码形式发送用户名和密码,并不加密。因此,在不安全的 HTTP 连接上使用基本身份验证是不安全的,容易被截获。始终优先在 HTTPS 连接上使用。
9. 忽略 SSL 证书警告:-k / --insecure
在开发或测试环境中,当遇到自签名或无效的 SSL 证书时,此选项可以绕过 SSL 证书验证。
bash
curl -k https://self-signed-cert.example.com
警告:在生产环境中,强烈不建议使用此选项,因为它会使连接容易受到中间人攻击。只在您完全了解风险的情况下在非生产环境中使用。
10. 详细输出:-v / --verbose
启用详细模式,显示请求和响应的详细信息,包括连接信息、请求头、响应头、SSL/TLS 握手细节和时间信息。这对于调试网络问题和理解 HTTP 交互过程非常有用。
bash
curl -v https://example.com
在输出中:
* 以 > 开头的行表示 curl 发送给服务器的数据。
* 以 < 开头的行表示 curl 从服务器接收的数据。
* 以 * 开头的行表示其他信息,如连接详情、SSL/TLS 协商过程。
实用技巧
除了上述常用选项外,curl 还有一些非常实用的技巧可以提升您的工作效率:
1. 下载多个文件
curl 可以通过在命令行中指定多个 URL 或多次使用 -O 选项来下载多个文件。
“`bash
下载两个不同名称的文件
curl -o file1.txt https://example.com/data/fileA.txt -o file2.txt https://example.com/data/fileB.txt
下载多个文件并保留原始文件名
curl -O https://example.com/image1.jpg -O https://example.com/document.pdf
“`
2. 调试请求与响应
结合 -v 和 -s(静默模式,抑制进度条和错误信息)可以获得详细的调试信息,同时避免进度条的干扰,使输出更易读。
bash
curl -vs https://example.com 2>&1 | less
这个命令会将 curl 的详细输出(通常发送到标准错误 stderr)重定向到标准输出 stdout,并通过 less 命令分页显示。这在分析复杂的 HTTP 交互时非常有用。
3. 设置超时时间
使用 --connect-timeout <秒> 设置连接服务器的最大等待时间,用 --max-time <秒> 设置整个请求的最大允许时间。
bash
curl --connect-timeout 5 --max-time 10 https://slow-server.com
4. 发送 Cookie
使用 -b <文件或字符串> 来发送 Cookie。
“`bash
从文件中读取并发送 Cookie
curl -b cookies.txt https://example.com/secure_page
直接发送 Cookie 字符串
curl -b “name=value; session=abc” https://example.com/page
“`
5. 上传文件:-F / --form
用于模拟 HTML 表单提交,上传文件或发送表单数据。
bash
curl -X POST -F "username=test" -F "profile=@/path/to/my/profile.jpg" https://api.example.com/upload
这里 @ 符号表示跟随的路径是一个文件。
总结
curl 是一个极其灵活且功能强大的命令行工具,是进行网络编程、调试和自动化任务的瑞士军刀。掌握其基本用法和常用选项,能够显著提高您在命令行下处理各种网络请求的效率。无论是简单的网页抓取、复杂的 API 测试,还是文件传输,curl 都能提供可靠且高效的解决方案。通过实践和探索其丰富的选项,您会发现 curl 远比您想象的更加强大。