linux 命令 curl 使用详解
概要说明
curl 是 Linux 下非常强大的 HTTP 工具,可用于各种网络协议的 HTTP 请求包括GET、POST、DELETE 及 PUT 等,查看帮助文档:
$ man curl
$ curl --help
Usage: curl [options...] <url>
-d, --data <data> HTTP POST data
-f, --fail Fail silently (no output at all) on HTTP errors
-h, --help <category> Get help for commands
-i, --include Include protocol response headers in the output
-o, --output <file> Write to file instead of stdout
-O, --remote-name Write output to a file named as the remote file
-s, --silent Silent mode
-T, --upload-file <file> Transfer local FILE to destination
-u, --user <user:password> Server user and password
-A, --user-agent <name> Send User-Agent <name> to server
-v, --verbose Make the operation more talkative
-V, --version Show version number and quit
This is not the full help, this menu is stripped into categories.
Use "--help category" to get an overview of all categories.
For all options use the manual or "--help all".
基本请求
# 默认使用 GET 请求
curl baidu.com
curl http://www.baidu.com/
# 打印 response header
curl -i http://www.baidu.com/
下载文件
# -O 参数:下载文件到当前目录,并保持原始文件名
curl -O https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
# -o 参数:下载文件到指定目录,并重命名文件
curl -o /tmp/epel.repo https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
# -L 参数:如果下载链接被重定向了,此参数可以跟踪重定向后的地址
curl -L -O https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.27-linux-glibc2.12-i686.tar.xz
# -# 参数:下载时显示进度条
curl -# -L -O https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.27-linux-glibc2.12-i686.tar.xz
# -C - 参数:断点续传,会读取本地的已下载的文件偏移量,- 表示自动寻找偏移量
curl -C - -# -L -O https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.27-linux-glibc2.12-i686.tar.xz
连接超时
$ curl --connect-timeout 5 google.com
curl: (28) Connection timed out after 1000 milliseconds
失败重试
--retry-all-errors # 遇到任何错误都进行失败重试
--retry <num> # 失败重试次数
--retry-delay <seconds> # 重试延迟间隔
--retry-max-time <seconds> # 最大重试时间,超过此时间后不会再重试,不管是否满足 retry 次数
设置代理
# 方法1:直接命令行参数指定
curl -x 127.0.0.1:7890 google.com
# 方法2:代理写入 ~/.curlrc,每次执行curl的时候自动读取代理地址
socks5=127.0.0.1:7890
设置referer
# 请求时指定 referer
curl --referer "www.aliyun.com" "https://www.baidu.com/"
# 通常的 refer 都是一个完整的 URL 地址
curl --referer "https://www.aliyun.com" "https://www.baidu.com/"
指定用户名密码
# 指定用户名密码,通常用于api接口调用
curl -u username:password http://www.xxxx.com/api/xxx
FTP文件上传
# -T 参数:指定需要上传的文件
$ curl -T /tmp/xx.iso -u webuser:admin123 ftp://x.x.x.x:9000/os/
HTTP请求
-X, --request <command> : 发送指定请求 <GET, HEAD, POST and PUT>
-I, --head : 发送 HEAD 请求, 仅输出响应头
-v, --verbose : 用于输出请求以及响应头
-H, --header : 设置请求头
-F, --form <name=content> : 发送 Form 请求
默认会使用 application/x-www-form-urlencoded,
如果要发送文件最好配合 -H 参数指定 multipart/form-data
-d, --data <data> : 发送文本或二进制数据, 需要配合 -H 参数使用
GET 请求
# 默认就是 GET 请求
curl -XGET https://releases.ubuntu.com/22.04.2/ubuntu-22.04.2-desktop-amd64.iso
HEAD 请求
比如想要下载文件,但是不知道文件的类型以及大小,我们就可以使用 HEAD 请求,它只返回response header 信息,比如。
$ curl -I https://releases.ubuntu.com/22.04.2/ubuntu-22.04.2-desktop-amd64.iso
HTTP/1.1 200 OK
Date: Fri, 21 Jul 2023 05:02:17 GMT
Server: Apache/2.4.29 (Ubuntu)
Last-Modified: Thu, 23 Feb 2023 04:13:52 GMT
ETag: "125b50000-5f5563d8c2da5"
Accept-Ranges: bytes
Content-Length: 4927586304
Content-Type: application/x-iso9660-image
POST 单文件上传
# 指定文件名 zipfile
curl -X POST http://localhost:8080/upload \
-F "zipfile=@/tmp/test.zip" \
-H "Content-Type: multipart/form-data"
POST 多文件上传
# 指定文件名 zipfile[]
curl -X POST http://localhost:8080/upload \
-F "zipfile[]=@/tmp/test1.zip" \
-F "zipfile[]=@/tmp/test2.zip" \
-H "Content-Type: multipart/form-data"
POST application/json 请求
- 命令行 json 请求
curl -XPOST "localhost:8080/api/xxx" \
-H 'Content-Type: application/json' \
-d '{
"name": "yzy",
"age": 20
}'
- json 文件请求,当 json 数据较大时使用
curl -XPOST "localhost:8080/api/xxx" \
-H 'Content-Type: application/json' \
--data-binary "@/tmp/xxx.json"