curl命令

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的比较 #

curlwget是两个常用的命令行下载工具,它们有一些不同的特点:

特性 curl wget
协议支持 多种协议 主要是HTTP、HTTPS、FTP
递归下载 不直接支持 支持
断点续传 支持 支持
上传功能 支持 不支持
脚本友好性 中等
默认行为 输出到标准输出 下载到文件
并行下载 不直接支持 不直接支持
后台运行 不直接支持 支持

注意事项 #

  1. 使用-k--insecure)选项忽略SSL证书验证会降低安全性,应谨慎使用。

  2. 在脚本中使用curl时,通常应该使用-s--silent)选项抑制进度信息,但可能需要-S--show-error)选项显示错误信息。

  3. 发送密码或敏感数据时,应注意命令可能会被记录在shell历史记录中。考虑使用环境变量或文件输入。

  4. 使用-X指定请求方法时,某些方法(如POST)可能需要额外的头信息或数据。

  5. 默认情况下,curl不会跟随HTTP重定向,需要使用-L选项。

提示 #

  • 使用-v选项可以查看详细的请求和响应信息,这对调试很有用
  • 使用-o /dev/null可以丢弃输出,只关注状态码或头信息
  • 使用-w选项可以自定义输出格式,显示各种请求信息
  • 对于复杂的请求,可以将选项和数据保存在文件中,使用-K选项读取
  • 使用--compressed选项可以请求服务器发送压缩的响应,减少传输数据量
  • 使用-C -选项可以自动断点续传
  • 在脚本中使用curl时,应该检查其退出状态码以处理错误
  • 使用--retry选项可以在失败时自动重试
  • 对于需要保持会话的请求,使用-c-b选项管理Cookie
  • 使用--trace--trace-ascii选项可以详细记录请求和响应的所有数据