前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >curl命令

curl命令

原创
作者头像
用户10638239
修改2024-01-16 14:06:52
1880
修改2024-01-16 14:06:52

1 curl 命令简介

curl(CommandLine Uniform Resource Locator),是一个利用 URL 语法,在命令行终端下使用的网络请求工具,支持 HTTP、HTTPS、FTP 等协议。curl也有用于程序开发使用的版本 libcurl

2. curl 命令使用格式

代码语言:bash
复制
基础语法:
    curl [options...] [url]
    
常用参数:
    1,常用参数: Show Info
    -h/--help                       # 打印帮助信息
    -V/--version                    # 显示版本信息
    -s/--silent                     # 静默模式, 不输出任何内容
    -i/--include                    # 输出包含 headers 信息
    -v/--verbose                    # 输出详细内容
    -#/--progress-bar               # 以进度条方式显示传输过程
    
    2,常用参数: Headers
    -H/--header     LINE        (H) # 添加请求头, 可添加多个 -H 参数, 
                                # 参数格式: -H "NAME: VALUE"
 
    -A/--user-agen  STRING      (H) # 请求头的 User-Agent 字段
    -e/--referer    URL         (H) # 请求头的 Referer 字段
    -r/--range      RANGE       (H) # 请求头的 Range 字段
    -b/--cookie     STRING/FILE (H) # 请求头的 Cookie 字段, 以字符串的形式提供, 
                                # 或从指定 cookie 文件中读取
 
    -c/--cookie-jar     FILE    (H) # 把响应头中的 cookie 保存到指定文件
 
    -D/--dump-header    FILE        # 把 headers 信息保存指定文件
    -I/--head                       # 只显示文档信息(只显示响应头)
    
    3,常用参数: Request Content
    # 执行命令, 如果是 HTTP 则是请求方法, 如: GET, POST, PUT, DELETE 等
    #          如果是 FTP 则是执行 FTP协议命令
    -X/--request    COMMAND
 
   # HTTP POST 请求内容(并自动发出 POST 请求), 例如: aa=bb&cc=dd
   -d/--data       DATA    (H)
 
   # HTTP multipart POST 表单数据,(并自动发出 POST 请求)
   # 多个表单字段可添加多个 -H 参数, 如果是文件参数, 路径值前面需要加@
   # 参考格式: -F "name1=@/filepath" -F "name2=stringvalue"
   -F/--form       CONTENT (H) 
   
   4,常用参数: Response Content
   -o/--output FILE    FILE        # 把响应内容输出到指定文件
   -O/--remote-name                # 以 URL 的文件名作为文件名称保存响应内容到当前目录
   -C/--continue-at    OFFSET      # 断点续传, 从 offset 位置继续传输
   
   5,常用参数: other
   -y/--speed-time     SECONDS     # 连接 超时时间, 单位: 秒,  默认为 30
   -m/--max-time       SECONDS     # 读取 超时时间, 必须在该时间内传输完数据, 单位: 秒
   --limit-rate        RATE        # 限速传输, 单位: Byte/s,如下命令中用k(千字节)和m(兆字节)指定下载速度限制。
   curl https://www.baidu.com --limit-rate 50k
   curl https://www.baidu.com --limit-rate 5m
 
   -x/--proxy          [PROTOCOL://]HOST[:PORT]    # 设置代理
   -U/--proxy-user     USER[:PASSWORD]             # 代理的用户名和密码
   -u/--user           USER[:PASSWORD][;OPTIONS]   # 设置服务器的用户密码和登录选项
   --cacert            FILE                  (SSL) # 使用指定的 CA 证书
 
  -P/--ftp-port       ADR (F) # 指定 FTP 传输的端口
  -T/--upload-file    FILE    # 上传文件到指定的 URL (http/ftp) 位置, 
                            # 参考格式: -T "file1" 或 -T "{file1,file2}"
 
  -Q/--quote    CMD  (F/SFTP) # 执行命令, -X 只执行一条命令, -Q 可执行多条,
                            # 多条命令将按顺序执行,
                            # 参考格式: -Q "cmd1" -Q "cmd2"

3 curl 命令使用实例

HTTP/HTTPS 网络请求
代码语言:bash
复制
1,普通 GET 请求:
curl https://www.baidu.com/         # GET请求, 输出 响应内容
curl -I https://www.baidu.com/      # GET请求, 只输出 响应头
curl -i https://www.baidu.com/      # GET请求, 输出 响应头、响应内容
curl -v https://www.baidu.com/      # GET请求, 输出 通讯过程、头部信息、响应内容等


2,POST 请求:
简单请求:
curl -X POST https://blog.ucwords.com

Form Data
curl -d 'name=123&age=23' -x POST https://blog.ucwords.com curl -d 'name=123' -d 'age=23' https://blog.ucwords.com
当使用参数 -d ,curl自动携带请求头:Content-Type:multipart/form-data。
当使用参数 -d ,-X POST 可以省略,因为会隐式发起 POST 请求。

JSON Data
curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://blog.ucwords.com
需要指定请求头: ‘Content-Type: application/json’。

–data-urlencode 将参数 URL 编码方式
如下参数间有空格会被编码为 %20
curl --data-urlencode 'name=1212 few' https://blog.ucwords.com

如果需要携带的参数没有经过 URL 编码,需要使用 --data-urlencode 进行处理,数据在通过网络发送出去之前被curl进行了URL编码。
需要指定请求头: ‘Content-Type: application/x-www-form-urlencoded’。

上传文件
curl -d '@data.txt' https://blog.ucwords.com
@是标志文件而非简单字符串。


Multipart Data 或者上传二进制文件
用 -F 参数,强制 curl 发出多表单数据的 POST 请求,自动携带 -H “Content-Type: multipart/form-data”。当需要上传图像或其他二进制文件时,发送多表单数据非常有用。
curl -F 'file=@image.png' https://blog.ucwords.com

上传二进制文件并设置其 MIME 类型
curl -F 'file=@image.png;type:image/png' https://blog.ucwords.com
curl -F 'file=@image.png;type:image/png;filename=target.png' https://blog.ucwords.com
如果没有指定类型,curl 会将其设置为 application/octet-stream。




请求头:

-H 设置请求头
curl -H 'Content-Type: application/json' -H 'Accept-Language: en-US' https://blog.ucwords.com

# POST 提交 JSON 数据(\表示命令语句还未结束, 换行继续)
curl -H "Content-Type: application/json"                \
     -d '{"username":"hello", "password":"123456"}'     \
     http://localhost/login
 
# POST 提交 表单数据
curl -F "user                \
     -F "password=123456"               \
     -F "head_image=@filepath.jpg"      \
     http://localhost/register
     
     
    
     
user-agent:

-A 设置 UA
curl -A 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0' https://blog.ucwords.com
清空则设置 -A “”



cookie,Cookie是一种常用的保持服务端会话信息的方法,crul也支持使用Cookie。
-b 设置 cookie
curl -b 'session=33232' -b 'session2=123fdreq' https://blog.ucwords.com
* 默认情况下,curl 不发送任何 cookie

-c 保存 cookie
curl -c cookie.txt https://blog.ucwords.com

从文件加载 cookie
curl -b cookie.txt https://blog.ucwords.com


可以通过--cookie参数指定发送请求时的Cookie值,也可以通过-b [文件名]来指定一个存储了Cookie值的本地文件:
curl -b stored_cookies_in_file bailu.com

Cookie值可能会被服务器所返回的值所修改,并应用于下次HTTP请求。这时,可以能过-c参数指定存储服务器返回Cookie值的存储文件:
curl -b cookies.txt -c newcookies.txt bailu.com



Referrer
-e 添加 referrer
curl -e 'https://google.com' https://blog.ucwords.com
清空则设置 -e “”

-H 也可以设置到 header中。
curl -H 'Referer: https://google.com' https://blog.ucwords.com



Redirect 重定向

curl -L https://blog.ucwords.com
使 curl 始终遵循 301、302、303 或任何其他 3XX 重定向。默认情况下,curl 不遵循重定向。




Basic Auth

-u user:pass
curl -u 'zhang:124' https://blog.ucwords.com

也可以放到URL中
curl https://user:pass@baidu.com

提示输入密码
curl -u 'user' https://blog.ucwords.com


4 其它HTTP请求方法

代码语言:bash
复制
目前为止,我们使用GET和POST两种HTTP请求。curl支持所有http请求方法,只要通过-X参数指定即可。
如,使用DELETE请求:
curl -X DELETE bailu.com/examlple.html

使用PUT请求,并指定请求数据:
curl -X PUT --data 'keyword=linux' bailu.com


下载文件:
# 指定保存的文件名称下载文件
curl https://www.baidu.com -o baidu.txt
 
# 使用 URL 指定的资源文件名保存下载文件(URL 必须指向具体的文件名)
curl https://www.baidu.com/index.html -O
 
# 指定 Usaer-Agent 和 Referer 请求头的值, 下载文件
curl -A "Mozilla/5.0 Chrome/70.0.3538.110 Safari/537.36" \
     -e "https://www.baidu.com/" \
     https://www.baidu.com/index.html -O
     
     
分块下载,有时候下载的东西会比较大,这个时候我们可以分段下载。使用内置option:-r
curl -r 0-100 -o dodo1_part1.JPG http://www.linux.com/dodo1.JPG
curl -r 100-200 -o dodo1_part2.JPG http://www.linux.com/dodo1.JPG
curl -r 200- -o dodo1_part3.JPG http://www.linux.com/dodo1.JPG
cat dodo1_part* > dodo1.JPG


断点续传
在windows中,我们可以使用迅雷这样的软件进行断点续传。curl可以通过内置option:-C同样可以达到相同的效果
如果在下载dodo1.JPG的过程中突然掉线了,可以使用以下的方式续传。
curl -C -O http://www.linux.com/dodo1.JPG


上传文件
上传文件时使用-T或--upload-file参数:
curl -T ./index.html http.com/receive.cgi


https支持
对于使用了SSL/TLS加密的HTTPS协议,可以使用curl直接访问:
$ curl https://itbilu.com

如果使用的本地ssl证书认证的HTTPS,可以通过-E或--cert参数指定本地证书:
$ curl -E mycert.pem https:/itbilu.com



限速:
--limit-rate用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境。
curl --limit-rate 200k https://google.com
上面命令将带宽限制在每秒 200K 字节。


重定向
-L参数会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。
curl -L -d 'tweet=hi' https://api.twitter.com/tweet


请求代理
-x参数指定 HTTP 请求的代理。
curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com
上面命令指定 HTTP 请求通过myproxy.com:8080的 socks5 代理发出。

如果没有指定代理协议,默认为 HTTP。
curl -x james:cats@myproxy.com:8080 https://www.example.com
上面命令中,请求的代理使用 HTTP 协议。


Socks5 代理
curl -x socks5://james:cats@myproxy.com:8080 https://blog.ucwords.com

Socks4 代理
curl -x socks4://james:cats@myproxy.com:8080 https://blog.ucwords.com

HTTP 代理
curl -x james:cats@myproxy.com:8080 https://blog.ucwords.com

不要为 xxx.com 使用代理
curl --no-proxy xxx.com https://blog.ucwords.com https://xxx.com


忽略 SSL 证书
curl -k https://blog.ucwords.com
指定证书版本 curl (-1-2-3) 代表 SSLv1、SSLv2、 SSLv3


静默输出
使用 -s 不会打印进度条、错误和其他可能妨碍的输出。要同时隐藏响应,请使用-o /dev/null(-o NUL 在 Windows 上)。


隐藏错误和进度条(但打印响应)
curl -s https://blog.ucwords.com

全部静默
curl -s -o /dev/null https://blog.ucwords.com

仅输出错误(当有)
curl -S -s -o /dev/null https://blog.ucwords.com
更多见 curl 调试部分。
限制 curl 带宽

使用 --limit-rate speed 选项 (k、m、g等单位)。
1. 限制每秒 20 KB :
curl --limit-rate 20k https://blog.ucwords.com
2. 限制每秒 1 字节:
curl --limit-rate 1 https://blog.ucwords.com
curl 调试

-v 参数打印有关请求和响应的详细信息。
curl -v https://blog.ucwords.com
输出结果解析:
1. 前缀以 > 开头的行是发送给服务器的数据。
2. 前缀以 > 开头的行是从服务器接收的数据.
3. 前缀以 * 开头的行如连接信息、SSL 握手信息、协议信息等。

–trace - 参数用来启用所有传入和传出数据的完整跟踪转储。跟踪转储打印发送和接收的所有字节的 hexdump。
curl --trace - https://blog.ucwords.com

–trace-time 带有时间戳的详细 trace
curl --trace - --trace-time https://blog.ucwords.com

仅打印请求头
curl -v -s -o /dev/null --stderr - https://blog.ucwords.com | grep '^>'

仅打印响应代码
curl -w '%{response_code}' -s -o /dev/null https://blog.ucwords.com
其他参数

-G 将参数以 & 链接拼接到 URL 后面
curl -G -d 'a=1' -d 'b=20' https://blog.ucwords.com

-I --head 发起 HEAD 请求
curl -I https://blog.ucwords.com

-o -O 保存响应到文件
curl -o response.txt https://blog.ucwords.com

-X 指定 HTTP 请求的方法
curl -X POST https://blog.ucwords.com 

5 FTP 上传 / 下载文件

假设 FTP 服务器 地址为:192.168.0.100; 用户名为:user; 密码为:passwd

1) 查看文件

代码语言:bash
复制
# 查看 FTP 指定目录(目录必须以"/"结尾)下的文件列表 
curl ftp://192.168.0.100/aaDir/ -u "user:passwd"
 
# 查看 FTP 指定文件的内容(直接输出到终端) 
curl ftp://192.168.0.100/aaDir/aa.txt -u "user:passwd"
 
# 用户名 和 密码 的另一种写法(查看 FTP 服务器指定目录)
curl ftp://user:passwd@192.168.0.200/aaDir/

2) 上传文件

代码语言:bash
复制
# 上传 aa.txt 文件到 FTP 指定目录下(目录必须以"/"结尾), 并以 原文件名 命名保存
curl ftp://192.168.0.100/aaDir/ -u "user:passwd" -T "aa.txt" -g
 
# 上传 aa.txt 文件到 FTP 指定目录下, 并以 bb.txt 命名保存(目录不存在时,只支持window下的ftp服务器)
curl ftp://192.168.0.100/aaDir/bb.txt -u "user:passwd" -T "aa.txt" -g
 
# 上传 aa.txt 文件到 FTP 指定目录下, 并以 bb.txt 命名保存(支持linux下的ftp服务器和window下的ftp服务器,使用--ftp-create-dirs自动创建目录。)
curl ftp://192.168.0.100/aaDir/bb.txt -u "user:passwd" -T "aa.txt" -g --ftp-create-dirs
 
# 同时上传多个文件
curl ftp://192.168.0.100/aaDir/ -u "user:passwd" -T "{aa.txt,bb.txt}" -g

a)文件路径包含了{}或者[],会上传失败,错误信息为:curl: (3) [globbing] bad range specification in column 146

解决方法:在命令行中增加-g

b)上传失败,返回错误信息是ftp response timeout,这个是ftp应答超时,实际上文件可能已经上传到ftp服务器中,在大批量上传时,ftp服务器会应答超时(保存文件慢),curl命令上传ftp应答超时时间默认是120秒,curl命令无法设置该选项,libcurl库通过CURLOPT_FTP_RESPONSE_TIMEOUT设置。

解决方法:出现ftp response timeout就认为ftp上传成功,然后定时使用ftp协议命令去查询ftp目录下是否存在该文件,判断文件ftp上传是否真正成功。

3) 下载文件

代码语言:bash
复制
# 下载 FTP 指定文件 /aaDir/aa.txt, 以原文件名命名保存到当前目录 
curl ftp://192.168.0.100/aaDir/aa.txt -u "user:passwd" -O
 
# 下载 FTP 指定文件 /aaDir/aa.txt, 以 bb.txt 命名保存
curl ftp://192.168.0.100/aaDir/aa.txt -u "user:passwd" -o bb.txt

4) 执行 FTP 协议命令

curl 执行 FTP 命令格式:

  • 单条命令: curl [-options] <ftpUrl> -X "FTP命令"
  • 多条命令: curl [-options] <ftpUrl> -Q "FTP命令"
代码语言:bash
复制
# 
# 创建文件夹, 在 /aaDir/ 目录(目录必须以"/"结尾)下创建 bbDir 文件夹(window系统下ftp服务器filezilla,linux系统下ftp服务器vsftp不支持这个方式创建目录)
#
curl -u "user:passwd" ftp://192.168.0.100/aaDir/ -X "MKD bbDir"
 
# 
# 创建文件夹, 在 /aaDir/ 目录(目录必须以"/"结尾)下创建 bbDir 文件夹(linux系统下ftp服务器vsftp不支持多级目录创建,只支持一次创建一个目录)
#
curl -u "user:passwd" ftp://192.168.0.100/aaDir/ -Q "MKD bbDir"
curl -u "user:passwd" ftp://192.168.0.100/aaDir/ -Q "MKD bbDir/ccDir"
curl -u "user:passwd" ftp://192.168.0.100/aaDir/ -Q "MKD bbDir/ccDir/ddDir"
 
# 
# 上传文件时自动创建文件夹, 在 /aaDir/ 目录(目录必须以"/"结尾)下创建 bbDir 文件夹(linux系统下ftp服务器vsftp);在上传文件中指定--ftp-create-dirs自动创建目录。
#
curl ftp://192.168.0.100/aaDir/bb.txt -u "user:passwd" -T "aa.txt" -g --ftp-create-dirs
curl ftp://192.168.0.100/aaDir/bb.txt -u "user:passwd" -T "aa.txt" -g --ftp-create-dirs -v
 
# 
# 删除文件夹, 删除 /aaDir/ 目录下的 bbDir 文件夹(文件夹必须为空)
#
curl -u "user:passwd" ftp://192.168.0.100/aaDir/ -X "RMD bbDir"
 
# 
# 删除文件, 删除 /aaDir/ 目录下的 aa.txt 文件
#
curl -u "user:passwd" ftp://192.168.0.100/aaDir/ -X "DELE aa.txt"
 
#
# 重命名, 重命名需要连续执行两条命令, 使用两个 -Q 参数连续执行两条命令(必须先 RNFR, 后 RNTO)
#
curl -u "user:passwd" ftp://192.168.0.100/ -Q "RNFR OldPath" -Q "RNTO NewPath"

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 curl 命令简介
  • 2. curl 命令使用格式
  • 3 curl 命令使用实例
  • 4 其它HTTP请求方法
  • 5 FTP 上传 / 下载文件
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档