概述

cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。

  • curl 命令用作网络数据包收发,常应用于非交互式环境中。
  • URL 的格式依赖于命令所使用的网络协议,相关详细信息可以查看《RFC 3986》文档。
  • 如果在一条命令中访问多个文件,crul 会尝试在多个传输会话间重用一个连接,以此减少建立不必要的连接或握手,从而访问速度。
  • 多个相互独立的 curl 命令调用之间不支持连接重用。
  • curl 运行时,默认启用传输进度条用于显示总传输数据大小、传输速度、预计剩余传输时间等。
  • 进度条数据默认直接输出到控制台。如果不希望这些数据在你 POST 或 PUT 时扰乱了 response数据包,可以使用重定向 > 或后跟参数 -o [file] 或其它同样功能的语句将相应数据重定向到文件中。
  • 使用参数 -# 可以让她看起来更像真正的进度“条”。

使用实例

* 不带有任何参数时,curl 就是发出 GET 请求。

curl https://www.example.com

请求POST

curl -v -X post "http://xxxx:xx" -d "{\"name\": \"allens\"}"

-v 输出到控制台
-X 指定http method
-d 携带参数

上传文件

curl -F 'file=@photo.png' https://google.com/profile

上面命令会给 HTTP 请求加上标头Content-Type: multipart/form-data,然后将文件photo.png作为file字段上传。

curl -F 'file=@photo.png;type=image/png' https://google.com/profile

上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为application/octet-stream。

curl -F 'file=@photo.png;filename=me.png' https://google.com/profile

上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。

构造 URL 的查询字符串。

curl -G -d 'q=kitties' -d 'count=20' https://google.com/search

上面命令会发出一个 GET 请求,实际请求的 URL 为https://google.com/search?q=kitties&count=20。如果省略–G,会发出一个 POST 请求。

如果数据需要 URL 编码,可以结合–data–urlencode参数。

curl -G --data-urlencode 'comment=hello world' https://www.example.com

携带http header

-H参数添加 HTTP 请求的标头。

curl -H 'Accept-Language: en-US' https://google.com

上面命令添加 HTTP 标头Accept-Language: en-US。

curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com

上面命令添加两个 HTTP 标头。

curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login

上面命令添加 HTTP 请求的标头是Content-Type: application/json,然后用-d参数发送 JSON 数据。

URL技巧

项目 Value
字符串匹配 http://site. {one,two,three}.com
字符匹配 ftp://ftp.letters.com/file [a-z].txt
数字匹配 ftp://ftp.numerical.com/file [1-100].txt
混合匹配 http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html
步进匹配 http://www.numerical.com/file [1-100:10].txt ,http://www.letters.com/file [a-z:2].txt

option参数

-h/--help      显示 curl 命令使用方法的简要帮助信息
-M/--manual    显示详细帮助文档
-a/--append    向服务器端文件追加内容。如果服务器端文件不存在,将创建该文件。
-A/--user-agent <agent string>    为 HTTP 数据包指定 User-Agent 字段内容,即浏览器信息。如果内容含有空格,请使用单引号括起来。有的网站要求访问者必须使用特定的浏览器甚至版本,这种情况下可以使用该参数绕过服务器的检测。 -H/--header <header string>
为 HTTP 数据包指定 Header 字段内容。如果要删除某个 header 字段,可以使用 <字段名>: 的格式替换 <header string> 代表的内容。比如删除 Host 字段的内容,可以这样添加 -H 参数:-H "Host:"
不要手动为你的 header 内容添加换行标记 \r\n,因为 curl 会帮你处理,否则只会让你的代码出现莫名奇妙的问题。
添加、替换、删除 header 字段的操作均由该参数实现。 -I/--head      只接收 response数据包中 header 字段的内容。 -b/--cookie <name=data>
为发送的 HTTP 数据包指定 cookie 内容,通常是之前同服务器通讯时,从服务器接收到的 response数据包中 Set-Cookie 字段中的内容。如果要指定多对值,格式为“NAME1=VALUE1;NAME2=VALUE2”。
如果内容中没有等号 =,则会被解析为存储 Cookie 的文件,此时还应该配合参数 -L/--location 使用。 -c/--cookie-jar <filename>    存储 response数据包中的 cookie 信息到文件中。如果文件名是破折号 -,则 cookie 将在 stdout 被打印出来。Cookie信息使用 Netscape cookie文件的格式进行记录。cookie 写入失败不会导致 curl 命令中止,使用 -v 参数可以在操作失败时看到警告信息。
-D/--dump-header <filename>    存储 response数据包中的 header 信息到文件中。在 FTP 传输中使用时,FTP 服务器的回复消息会被视作 headers 存储起来。
--connect-timeout <seconds>    设置连接超时。这个值是对于连接建立阶段而言的,一旦连接被建立,这个限制就没用了。
-m/--max-time
-C/--continue-at <offset>    断点续传。<offset>是一个数值,表示从文件头开始计算的要跳过的字节数。如果<offset>被设定为破折号 -,那么 curl 命令将自行检测待传输文件的断点位置。
--create-dirs    创建目录。通常与参数 -o 连用,用于为 /dir/filename 这样的参数创建目录 dir/。比如 -c /recvDir/cookie.txt --create-dirs
--ftp-create-dirs    为 FTP/SFTP 传输创建远程目录。
--crlf    在 FTP 上传中将 LF 转换为 CRLF。 -d/--data <data>
为 POST 数据包指定要向 HTTP 服务器发送的数据并发送出去。这个过程和在浏览器中点击“submit”按钮是一样的,且数据将以 content-type application/x-www-form-urlencoded 的方式被编码。
在同一条命令中多次使用 -d 参数,参数后的内容会被符号 & 拼接起来。比如 -d name=daniel -d skill=lousy 会被转化为 name=daniel&skill=lousy
如果<data>的内容以符号 @ 开头,其后的字符串将被解析为文件名,curl 命令会从这个文件中读取数据发送,但文件中的内容必须是 URL 编码的格式;如果内容以符号 - 开头,curl 命令将从 stdin 读取数据发送。--data-binary <data>    为 POST 数据包指定要向 HTTP 服务器发送的数据并发送出去。数据将以二进制的形式被送出。
--data-urlencode <data>    为 POST 数据包指定要向 HTTP 服务器发送的数据并发送出去。数据在发送前将进行 URL-encode 编码。
--digest    为 HTTP 传输启用摘要加密算法,防止登录信息被明文传输。通常在其后使用 -u/--user 参数指定用户名和密码。
--ntlm
--negotiate
--anyauth
-e/--referer <URL>    为 HTTP 数据包指定 Referer Page 信息,即前一个被访问页面的 URL。通常这个信息被服务器用于判断自己是否被盗链,如果发现服务器端有这样的检测机制,则可以使用该参数绕过检测。
-E/--cert <certificate[:password]>    为 HTTPS/FTPS 数据包指定数字证书。数字证书必须是 PEM 格式。如果 password 没有在内容中显式给定,则会在连接建立时被服务器端询问。
-f/--fail    禁止服务器在打开页面失败或脚本调用失败时向客户端发送错误说明,取而代之,curl 会返回错误码 22。 -F/--form <name=content>
模拟用户在浏览器上点击“submit”按钮提交表单的操作。如果想提交文件,可以将<name=content>中 content部分的内容替换为 @filename 的格式;如果想提交文件中的内容,可以将 content部分的内容替换为 <filename 格式;如果想提交从 stdin 获取的到的数据,可以将 content部分的内容替换为 @- 或者 <-
比如,要提交存储密码的文件到服务器上,命令为:curl -F password=@/etc/passwd www.mypasswords.com
要将文件中的内容作为密码提交到服务器上,命令为:curl -F password=</etc/passwd www.mypasswords.com
在<name=content>内容中添加“type=xxx”字段可以指定 Content-Type 类型。
比如 curl -F "web=@index.html;type=text/html" url.com
或者 curl -F "name=daniel;type=text/foo" url.com 还可以从文件读取待发送内容后,修改数据包中的文件名信息,像这样:curl -F "file=@localfile;filename=nameispost" url.com
-g/--globoff    关闭 URL 的通配符功能。这样就可以访问名称中含有字符 {、}、[、] 的文件了。
-G/--get    将 -d 参数后指定的数据以 GET 方法打包发送,并在数据末尾添加一个问号 ?
--hostpubmd5 <md5>    为数据包指定一个 32 位的十六进制数。这个数应该与远程服务器公钥的 MD5 值相同。如果 MD5 值不相同,curl 将中止连接。这个参数只在 SCP/SFTP 传输协议中使用。
-i/--include    使输出信息中包含 HTTP-header 的内容,比如 server-name、HTTP-version 等。
--interface <name>    使用指定网卡访问/传输数据。命令格式:curl --interface eth0:1 http://www.netscape.com/
--keepalive-time <seconeds>    为连接设定保活时间。这个值同时也是相邻 2 次发送保活消息的时间间隔。 --K/--config <config file>
为 curl 命令指定一个配置文件,curl 会从该文件中读取内容并作为自己的运行参数。 默认的配置文件是 ~/.curlrc。当 <config file> 的内容被写成符号 - 时,curl 会从 stdin 读取配置。
配置文件每一行只能写一个参数;支持使用符号 \ 对字符进行转义;如果内容中含有空格,需用引号括起来;以符号 # 开始的内容会被视为注释;文件中的 URL 信息需要写成 url = URL 这样的格式。
配置文件示例如下:
# --- Example file ---
# this is a comment
url = "curl.haxx.se"
output = "curlhere.html"
user-agent = "superagent/1.0"
# and fetch another URL too
url = "curl.haxx.se/docs/manpage.html"
-O
referer = "http://nowhereatall.com/"
# --- End of example file --- -q    如果这个参数是 curl 命令的第一个参数,那么 curl 命令将不会去读取默认的 curlrc 配置文件。
--libcurl <file>    将本条命令实现的功能转换成调用 libcurl 的 C 代码,并保存在 <file> 文件中。但是目前还不能很好地转化带 -F 参数的命令。
--limit-rate <speed>    为数据包指定最大传输速率,这样就不会占用整个带宽。通常在数据处理管道不够用时使用。默认的速率单位是 bytes/s,如果在数字后加上 k、m、g 等后缀,如 200k,则表示 200Kb/s。
--local-port <num>[-num]    为连接指定一个本地端口。
--L/--location   当服务器报告被请求的页面已被移动到另一个位置时(通常返回 3XX 错误代码), 允许 curl 使用新的地址重新访问。如果跳转链接指向了一个不同的主机,curl 将不向其发送用户名和密码。
--location-trusted    该参数和 -L 参数类似,也可让 curl 继续访问跳转链接,区别在于该参数允许向跳转链接发送明文用户名和密码。
--max-redirs <num>   指定最大跳转次数。默认的次数限制为 50。如果将 <num> 设置为 -1 表示不进行限制。
-m/--max-time <seconds>    为数据传输过程指定超时时间。如果传输过程在这个时间内没有完成,连接将被中止。防止脚本因为网络不好或链接失效而挂死。 -o/--output <file>
将获取到的数据存入文件中,而不是打印出来。如果在 URL 中使用了 {} 或 [] 进行通配,我们就可以在 <file> 中使用 #1、#2 ... 的形式来顺序表示这些通配符中的内容。 比如下面这样的写法: curl http://{one,two}.site.com -o "file_#1.txt" curl http://{site,host}.host[1-5].com -o "#1_#2" -O/--remote-name    在本地保存获取的数据时,使用她们在远程服务器上的文件名进行保存。
--random-file <file>    为 SSL 连接指定一个存有随机数的种子的文件。
--retry <num>    在数据包的传输失败时,为其指定重试次数。默认次数为 0,即不重传。连接超时、500错误代码都会引起重传。
-s/--silent   将 curl 设定在静默模式下工作。进度条和错误消息都不会被显示。
--stderr <file>    重定向错误输出到文件。 -T/--upload-file <file>
这个参数用于向远程服务器传输指定文件。上传文件时,URL必须以符号 / 结尾才会被识别为目录。当文件名是符号 - 时,curl 将从 stdin 读取输入数据进行上传。如果远端是 HTTP 服务器,那么应该使用 PUT 方法。
命令格式如下:
curl -T "{file1,file2}" http://www.uploadtothissite.com
curl -T "img[1-1000].png" ftp://ftp.picturemania.com/upload/ --trace <file>    启用对所有数据包传输的追踪,并记录到指定文件中。当文件名是符号 - 时,追踪消息将输出到标准输出。
--trace-ascii <file>    类似于 --trace ,但是是以 ascii 的形式输出的而非十六进制,便于阅读。
-u/--user <user:password>    为数据传输在服务器端的身份验证提供用户名/密码信息。
-U/--proxy-user <username:password>    为数据传输在代理服务器上的身份验证提供用户名/密码信息。
-v/--verbose    显示数据传输过程中的详细信息。
-V/--version    显示 curl 及其所使用的 libcurl 的版本信息。 -w/--write-out <format>
在数据传输完成后,输出和本次传输相关的参数信息,比如 header 的大小、下载速度等。<format>部分即格式化输出内容,变量使用格式为 %{varible},使用 %% 输出百分号 %,使用 \r、\n、\t 输出 回车、换行、制表符。
所有支持的变量如下表所示:
url_effective    上次访问的URL。
http_code    上一次 HTTP 或 FTP 数据传输过程中的 response 数值代码。
http_connect    上一次 CONNECT 请求中的数值代码
time_total    数据传输消耗的总时间,以秒为单位,精度为毫秒。
time_namelookup    从数据传输开始到域名解析完成所花费的时间。
time_connect    TCP连接建立成功所花费的时间。
time_appconnect    应用层协议,如 SSL/SSH、三次握手等过程完成所花费的时间。
time_redirect    从跳转链接被激活到真正开始从跳转链接下载数据所经过的时间。
time_starttransfer    从请求连接开始,到第一个字节被传送前所经过的时间。
size_download    数据传输过程中下载的总数据大小。
size_upload    数据传输过程中上传的总数据大小。
size_header    下载的数据包中,header 字段的总数据大小。
size_request    被发送的 HTTP request 的总数据大小。
speed_download    整个数据传输过程中的平均数据下载速度。
speed_upload    整个数据传输过程中的平均数据上传速度。
content_type    被请求访问的文件的 Content_Type 类型。
num_redirects    访问请求中包含的跳转链接数量。
redirect_url    跳转链接指向的URL ssl_verify_result    SSL验证的结果。值为 0 时表示验证成功。
-x/--proxy <proxyhost[:port]>    为数据传输指定代理服务器。如果没有显示指定端口号,则使用默认端口号1080
-X/--request <command>    为 HTTP 数据包指定一个方法,比如 PUT、DELETE。默认的方法是 GET。
-z/--time-cond <date expression>    请求一个时间点比 <date expression> 中描述的时间更早或更晚的文件。<date expression>以符号 - 开始时表示访问比该时间点更早的文件,以数字开始时表示访问比该时间点更晚的文件。
-0/--http1.0    强制在 HTTP 传输时使用 HTTP 1.0 协议。默认使用 HTTP 1.1
-1/--tlsv1    强制在 SSL 传输时使用 TLS v1 协议
-2/--sslv2    强制在 SSL 传输时使用 SSL v2 协议
-3/--sslv3    强制在 SSL 传输时使用 SSL v3 协议
-4/--ipv4    强制解析域名为 IPv4 地址
-6/--ipv6    强制解析域名为 IPv6 地址

退出代码/返回值

退出代码 描述
1 curl 不支持该协议
2 curl 初始化失败
3 URL 格式错误
5 解析代理服务器失败
6 解析主机失败
7 建立与主机的连接失败
8 无法解析 FTP 服务器返回的消息
9 FTP 服务器拒接访问。可能是拒绝登录或拒绝访问特定目录,但很多情况下是访问了一个不存在的位置导致的
11 无法解析 FTP 服务器的 PASS 回复消息
13 无法解析 FTP 服务器的 PASV 回复消息
14 无法解析 FTP 服务器的 227-line 回复消息
15 无法解析 FTP 主机
17 无法与 FTP 服务器建立二进制传输模式
18 文件传输不完整。只有文件的一部分被传送了。
19 FTP 下载/访问指定的文件失败
21 FTP 引用错误
22 HTTP 页面获取失败。将返回 400 及其以上的错误码。
23 写入数据到本地文件系统发生错误
25 FTP 服务器无法存储被上传的文件
26 读取数据出错
27 内存分配失败
28 操作超时
30 FTP 服务器运行 PORT 命令失败
31 FTP 服务器运行 REST 命令失败
33 HTTP 服务器执行 range 命令失败
34 HTTP 服务器 post 方法错误
35 SSL 连接出错。通常是 SSL 握手失败。
36 FTP 断点续传出错,无法继续前一次下载任务。
37 FILE 协议无法打开文件。可能是没有权限导致的
38 LDAP 协议无法执行 bind 操作
39 LDAP 协议执行搜索功能失败
41 没有找到匹配的 LDAP 功能
42 curl 被其它应用程序中止运行
43 发生内部错误。通常是因为调用函数时传递了错误的参数
45 接口调用错误
47 跳转链接数量达到上限
48 为 telnet 协议指定了一个未知的参数
49 telnet 协议的参数格式有误
51 SSL 认证或 SSH 的 MD5 指纹不正确
52 服务器无应答
53 未找到 SSL 加密引擎
54 无法将 SSL 加密引擎设为默认引擎
55 发送网络数据失败
56 接收网络数据失败
58 本地证书有问题
59 无法使用指定的 SSL 密码
60 已知的 CA证书无法用于验证
61 无法识别传输编码
62 无效的 LDAP URL
63 文件大小超过限制
64 请求的 FTP SSL 级别获取失败
65 发送需要进行 rewind 的数据失败
66 解析 SSL 引擎失败
67 用户名/密码验证失败,curl 无法登录
68 TFTP 服务器上没有找到指定的文件
69 对 TFTP 服务器的访问出现权限问题
70 TFTP 服务器已耗尽磁盘空间
71 非法的 TFTP 操作
72 未知的 TFTP 传输 ID
73 TFTP 企图传输一个已经存在的文件
74 用户不存在导致 TFTP 操作失败
75 字符转换失败
76 需要使用字符转换函数
77 读取 SSL CA 证书出错。可能是证书路径不正确,也可能是没有权限
78 URL 中指定的资源不存在
79 SSH 会话中发生了未知错误
80 中断 SSH 连接失败
82 无法加载 CRL 文件。可能是没有指定正确的格式
83 发布者身份验证失败

CURL 使用教程以及命令总结相关推荐

  1. 一丶宝塔+青龙面板安装部署教程及命令-依赖库

    一丶宝塔+青龙面板安装部署教程及命令-依赖库 QQ交流群:1014549449 直达 - 没有服务器的先自行购买,这里推荐腾讯云2H4G首年70 点击购买 建议装centos7.6安装宝塔,后期调试及 ...

  2. Systemd入门教程:命令篇

    Systemd入门教程:命令篇 转自:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 作者: 阮一峰 日期: ...

  3. xp系统如何查看计算机用户,xp查看电脑配置、查看电脑型号详细教程和命令

    如何查看电脑配置.如何查看电脑型号?本文以xp系统查看电脑配置信息作为教程,系统的给大家讲解不用任何软件也可以将电脑的配置信息参数查看清楚,部分步骤需要用到windows操作系统常见的命令来查看,好了 ...

  4. 超详细Redis入门教程——Redis命令(下)

    前言 本文小新为大家带来 超详细Redis入门教程--Redis命令 相关知识,具体内容包括简单动态字符串 SDS,集合的底层实现原理,BitMap 操作命令,HyperLogLog 操作命令,Geo ...

  5. 超详细Redis入门教程——Redis命令(上)

    前言 本文小新为大家带来 超详细Redis入门教程--Redis命令(上) 相关知识,具体内容包括Redis 基本命令,Key 操作命令,String 型 Value 操作命令,Hash 型 Valu ...

  6. Mysql入门教程--基础命令

    Mysql入门教程--基础命令 #mysql ----------------------------------------------------------------------------- ...

  7. walking与Matlab入门教程-ros2命令

    系列文章目录 walking与Matlab入门教程-安装matlab 2022a软件 walking与Matlab入门教程-安装visual studio 2019软件 walking与Matlab入 ...

  8. QIIME 2教程. 24Python命令行模式Artifact API(2021.2)

    Python命令行模式 Artifact API https://docs.qiime2.org/2021.2/interfaces/artifact-api/ 注:本指南假定您已执行"4人 ...

  9. QIIME 2教程. 24Python命令行模式Artifact API(2020.11)

    文章目录 Python命令行模式 译者简介 Reference 猜你喜欢 写在后面 Python命令行模式 Artifact API https://docs.qiime2.org/2020.11/i ...

最新文章

  1. dbface backbone
  2. Fibonacci(斐波纳契)数列各种优化解法
  3. java什么叫内部对象,java – 函数对象的内部类中的变量/对象会发生什么?
  4. 【论文解读】深度强化学习基石论文:函数近似的策略梯度方法
  5. EBS ORACLE使用API批量取消销售订单
  6. 电子琴节奏包制作_济南这个藏在菜市场的小饺子馆,纯手工制作,老板娘一个人不停忙...
  7. “鸡肋”的百度,掉队了 BAT? | 畅言
  8. MYSQL中5.7.10ROOT密码及创建用户
  9. 来自一个从事单片机工作中遇到的真人真事,单片机从业者可以借鉴
  10. Java环境安装及环境变量的配置
  11. 2016年4月11日作业
  12. obtain,get,gain有什么区别
  13. 网站性能优化三大策略
  14. guid分区怎么装win7_GUID分区是否可以装Win7?
  15. 误删除文件怎么找回 数据恢复用这些方法
  16. 关于vega打不开的问题
  17. Eclipse设置自动保存
  18. 刷了 1000 多道算法题,一点小小的心得!
  19. 20154322杨钦涵 Exp6 信息搜集与漏洞扫描
  20. 使用MATLAB的EEGLAB和BCT工具箱画脑网络连接图

热门文章

  1. 计算机网络知识框架图---物理层
  2. 开篇 让我们跟着Ray Zhang的脚步展望一下五年后的软件界
  3. 【多式联运】基于matlab粒子群结合遗传算法求解陆海空多式联运问题【含Matlab源码 2061期】
  4. 胶片打印、排版、自助打印(二)
  5. 影像篡改与识别(一):胶片时代
  6. lgg7深度详细参数_石材雕刻机加工程序菜单栏目按钮相关功能详细介绍
  7. Doxygen wizard - Expert - Dot
  8. mathtype 7.4中文版如何嵌入到word2016中
  9. PLC和变频器通讯方式
  10. 腾讯云服务器和轻量云服务器区别是什么?