已复制
全屏展示
复制代码

linux 命令 curl 使用详解


· 4 min read

概要说明

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"
    
🔗

文章推荐