curl命令 #
curl
是一个功能强大的命令行工具,用于传输数据,支持多种协议,包括HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、DICT、TELNET、LDAP、SMTP、POP3等。它是网络测试、API调用、文件下载和数据传输的重要工具。
语法 #
curl [选项] [URL...]
常用选项 #
基本选项 #
选项 | 描述 |
---|---|
-o, --output <文件> |
将输出写入文件 |
-O, --remote-name |
使用URL中的文件名保存文件 |
-s, --silent |
静默模式,不显示进度或错误信息 |
-S, --show-error |
与-s一起使用时显示错误信息 |
-f, --fail |
服务器错误时不输出错误文档 |
-v, --verbose |
显示详细信息 |
-#, --progress-bar |
显示进度条 |
-L, --location |
跟随重定向 |
-i, --include |
在输出中包含HTTP头 |
-I, --head |
只显示HTTP头 |
-X, --request <命令> |
指定请求方法(GET、POST、PUT等) |
-d, --data <数据> |
HTTP POST数据 |
-F, --form <名称=内容> |
指定multipart MIME数据 |
-H, --header <头> |
自定义HTTP头 |
-A, --user-agent <字符串> |
指定用户代理字符串 |
-b, --cookie <数据> |
发送Cookie |
-c, --cookie-jar <文件> |
将Cookie保存到文件 |
-u, --user <用户:密码> |
指定用户名和密码 |
-k, --insecure |
允许不安全的SSL连接 |
-x, --proxy <[协议://][用户:密码@]主机[:端口]> |
使用代理 |
-U, --proxy-user <用户:密码> |
代理用户名和密码 |
-e, --referer <URL> |
指定引用页URL |
-T, --upload-file <文件> |
上传文件 |
-C, --continue-at <偏移> |
断点续传 |
-z, --time-cond <时间> |
基于时间条件传输 |
-m, --max-time <秒> |
设置最大传输时间 |
-w, --write-out <格式> |
完成后显示指定格式的信息 |
--connect-timeout <秒> |
连接超时时间 |
--retry <次数> |
重试次数 |
--compressed |
请求压缩响应 |
--trace <文件> |
将详细跟踪信息写入文件 |
--trace-ascii <文件> |
类似–trace但不包含十六进制输出 |
--limit-rate <速率> |
限制传输速率 |
--max-filesize <字节> |
下载的最大文件大小 |
--interface <名称> |
使用指定的网络接口 |
--dns-servers <地址> |
使用指定的DNS服务器 |
--resolve <主机:端口:地址> |
强制解析主机和端口到地址 |
--cacert <文件> |
CA证书文件 |
--cert <证书[:密码]> |
客户端证书文件和密码 |
--key <密钥> |
私钥文件 |
--help |
显示帮助信息 |
--version |
显示版本信息 |
HTTP/2选项 #
选项 | 描述 |
---|---|
--http2 |
使用HTTP 2 |
--http2-prior-knowledge |
使用HTTP 2而不进行HTTP/1.1升级 |
--http1.1 |
使用HTTP 1.1 |
--http1.0 |
使用HTTP 1.0 |
安装 #
在大多数Linux发行版中,curl
命令通常已经预装。如果没有,可以使用以下命令安装:
# Debian/Ubuntu
sudo apt install curl
# CentOS/RHEL
sudo yum install curl
# Fedora
sudo dnf install curl
# Arch Linux
sudo pacman -S curl
常见用法 #
1. 获取网页内容 #
curl https://example.com
2. 下载文件 #
curl -o output.html https://example.com
3. 使用URL中的文件名保存文件 #
curl -O https://example.com/file.zip
4. 下载多个文件 #
curl -O https://example.com/file1.zip -O https://example.com/file2.zip
5. 跟随重定向 #
curl -L https://example.com
6. 显示HTTP头 #
curl -I https://example.com
7. 在输出中包含HTTP头 #
curl -i https://example.com
8. 发送POST请求 #
curl -X POST -d "name=John&age=30" https://example.com/api
9. 发送JSON数据 #
curl -X POST -H "Content-Type: application/json" -d '{"name":"John","age":30}' https://example.com/api
10. 发送表单数据 #
curl -F "name=John" -F "age=30" -F "[email protected]" https://example.com/upload
11. 设置HTTP头 #
curl -H "Authorization: Bearer token123" https://example.com/api
12. 使用基本认证 #
curl -u username:password https://example.com/api
13. 发送Cookie #
curl -b "name=value" https://example.com
14. 保存Cookie #
curl -c cookies.txt https://example.com
15. 使用代理 #
curl -x http://proxy.example.com:8080 https://example.com
16. 上传文件 #
curl -T file.txt https://example.com/upload
17. 断点续传 #
curl -C - -O https://example.com/large_file.zip
18. 限制下载速度 #
curl --limit-rate 100k -O https://example.com/large_file.zip
19. 设置超时 #
curl --connect-timeout 10 --max-time 30 https://example.com
20. 忽略SSL证书验证 #
curl -k https://example.com
21. 使用特定的网络接口 #
curl --interface eth0 https://example.com
22. 使用HTTP/2 #
curl --http2 https://example.com
23. 显示详细信息 #
curl -v https://example.com
24. 显示进度条 #
curl -# -O https://example.com/large_file.zip
25. 使用特定的DNS服务器 #
curl --dns-servers 8.8.8.8 https://example.com
实用示例 #
1. 测试REST API #
# GET请求
curl https://api.example.com/users
# POST请求
curl -X POST -H "Content-Type: application/json" -d '{"name":"John","age":30}' https://api.example.com/users
# PUT请求
curl -X PUT -H "Content-Type: application/json" -d '{"name":"John","age":31}' https://api.example.com/users/123
# DELETE请求
curl -X DELETE https://api.example.com/users/123
2. 下载文件并显示进度 #
curl -# -O https://example.com/large_file.zip
3. 测试网站响应时间 #
curl -o /dev/null -s -w "Connect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://example.com
4. 检查HTTP状态码 #
curl -s -o /dev/null -w "%{http_code}" https://example.com
5. 使用基本认证访问受保护的资源 #
curl -u username:password https://example.com/protected
6. 上传文件到FTP服务器 #
curl -T file.txt ftp://ftp.example.com/upload/ --user username:password
7. 下载FTP文件 #
curl -O ftp://username:[email protected]/file.txt
8. 使用代理服务器 #
curl -x http://proxy.example.com:8080 https://example.com
9. 发送表单数据并上传文件 #
curl -F "name=John" -F "[email protected]" https://example.com/upload
10. 检查网站支持的HTTP方法 #
curl -X OPTIONS -i https://example.com
11. 使用客户端证书进行认证 #
curl --cert client.pem --key key.pem https://example.com
12. 保存HTTP头到文件 #
curl -D headers.txt https://example.com
13. 模拟特定浏览器 #
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://example.com
14. 使用Cookie进行会话管理 #
# 获取并保存Cookie
curl -c cookies.txt -X POST -d "username=user&password=pass" https://example.com/login
# 使用保存的Cookie
curl -b cookies.txt https://example.com/dashboard
15. 使用HTTP基本认证并跟随重定向 #
curl -L -u username:password https://example.com/protected
与wget的比较 #
curl
和wget
是两个常用的命令行下载工具,它们有一些不同的特点:
特性 | curl | wget |
---|---|---|
协议支持 | 多种协议 | 主要是HTTP、HTTPS、FTP |
递归下载 | 不直接支持 | 支持 |
断点续传 | 支持 | 支持 |
上传功能 | 支持 | 不支持 |
脚本友好性 | 高 | 中等 |
默认行为 | 输出到标准输出 | 下载到文件 |
并行下载 | 不直接支持 | 不直接支持 |
后台运行 | 不直接支持 | 支持 |
注意事项 #
-
使用
-k
(--insecure
)选项忽略SSL证书验证会降低安全性,应谨慎使用。 -
在脚本中使用
curl
时,通常应该使用-s
(--silent
)选项抑制进度信息,但可能需要-S
(--show-error
)选项显示错误信息。 -
发送密码或敏感数据时,应注意命令可能会被记录在shell历史记录中。考虑使用环境变量或文件输入。
-
使用
-X
指定请求方法时,某些方法(如POST)可能需要额外的头信息或数据。 -
默认情况下,
curl
不会跟随HTTP重定向,需要使用-L
选项。
提示 #
- 使用
-v
选项可以查看详细的请求和响应信息,这对调试很有用 - 使用
-o /dev/null
可以丢弃输出,只关注状态码或头信息 - 使用
-w
选项可以自定义输出格式,显示各种请求信息 - 对于复杂的请求,可以将选项和数据保存在文件中,使用
-K
选项读取 - 使用
--compressed
选项可以请求服务器发送压缩的响应,减少传输数据量 - 使用
-C -
选项可以自动断点续传 - 在脚本中使用
curl
时,应该检查其退出状态码以处理错误 - 使用
--retry
选项可以在失败时自动重试 - 对于需要保持会话的请求,使用
-c
和-b
选项管理Cookie - 使用
--trace
或--trace-ascii
选项可以详细记录请求和响应的所有数据