curl

用于命令行和脚本进行传输数据到服务器或者从服务器传输数据的工具

  • 支持广泛的协议,如:ftp、http、https、pop3、scp、sftp、telent等

  • 支持SSL证书,HTTP中各方法、cookies、head、authentication

  • 免费开源软件

    使用场景:

  • 请求、验证、测试链接

  • 支持连接超时、保活时间设置,支持下载上传速率的配置,支持重试机制等

  • 测试restful接口

  • 上传、下载文件

    语法

    curl [options] [URL…]

    参数 描述
    -V 显示当前的curl版本
    -# 对发送和接收进行简单的进度bar展示
    -0 强制使用HTTP 1.0协议
    -1 强制使用TLS version 1.x
    -4 解析域名为ipv4地址(域名有多个ip时)
    -a FTP/SFTP上传文件时,curl将追加到目标文件,而非覆盖
    -A 设置用户代理
    -b 设置cookies
    –basic 使用HTTP Basic authentication
    –compressed 使用curl支持的压缩算法请求压缩的响应, 如果请求的响应不是压缩的,curl抛出异常
    –connect-timeout 设置连接超时时间
    -d 用于post请求时表单提交数据, 请求类型将被设置为:application/x-www-form-urlencoded
    -e 发送”Referer Page”到服务器
    -F form表单提交
    -G 使用get请求发送 -d参数指定的数据
    -H 增加Head头
    -i 在输出Head头(响应)
    -I 只输出Head头(响应)
    –interface 指定使用的网络接口
    -k 允许curl使用非安全的ssl连接并且传输数据(证书不受信)
    -K 后接参数文件,参数文件中可以定义HTTP请求的相关的内容(URL、HEAD、DATA)
    –keepalive-time 设置连接的保活时间
    -L curl自动重定向(3xx)
    –limit-rate 特指最大的传输速率
    -m 设置整个操作的允许消耗的最大时间,对于在延时网络下的批量操作有利
    –max-filesize 允许下载文件的最大大小
    -N 禁用输出流缓冲区
    –no-keepalive 连接不保活
    -o 将响应数据输出到指定文件,后接文件参数
    –retry 发生瞬时错误时,curl将重试执行数据传输
    –retry-delay 延迟重试
    –trace dump出输入输出数据至文件
    -v 获取更多输入输出相关的内容,对于debug非常有用
    -y或者–speed-time 如果在speed-time期间,下载比speed-limit这个更慢,则下载废止
    -Y或者–speed-limit 如果在speed-time期间,下载比speed-limit这个更慢,则下载废止

    example

1
2
# -i表示显示返回消息的头部
curl -X METHOD -H HEADER -i
1
2
# -d后面表示请求消息体,如果消息体在文件中,那么使用@符号作为前缀对文件进行读取
curl -i -X POST -H "Content-Type: application/json" -d @auth.json http://host:port/v3/auth/tokens
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# 不带有任何参数时,curl 就是发出 GET 请求。
curl https://www.example.com
#上面命令向www.example.com发出 GET 请求,服务器返回的内容会在命令行输出。

# -A参数指定客户端的用户代理标头,即User-Agent。curl 的默认用户代理字符串是curl/[version]。
curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com
# 上面命令将User-Agent改成 Chrome 浏览器。
curl -A '' https://google.com
# 上面命令会移除User-Agent标头。
# 也可以通过-H参数直接指定标头,更改User-Agent。
curl -H 'User-Agent: php/1.0' https://google.com

# -b参数用来向服务器发送 Cookie。
curl -b 'foo=bar' https://google.com
# 上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie。
curl -b 'foo1=bar' -b 'foo2=baz' https://google.com
# 上面命令发送两个 Cookie。
curl -b cookies.txt https://www.google.com
# 上面命令读取本地文件cookies.txt,里面是服务器设置的 Cookie(参见-c参数),将其发送到服务器。

# -c参数将服务器设置的 Cookie 写入一个文件。
curl -c cookies.txt https://www.google.com
# 上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。

# -C switch是恢复我们文件传输的设备,但还要注意,它后面紧跟一个破折号(-)。这告诉cURL继续文件传输,但是实现这一步,首先要查看已经下载的部分,找到下载的最后一个字节才可以确定从何处可以恢复。
curl -C - example.com/some-file.zip --output MyFile.zip

# -d参数用于发送 POST 请求的数据体。
curl -d'login=emma&password=123'-X POST https://google.com/login
# 或者
curl -d 'login=emma' -d 'password=123' -X POST https://google.com/login
# 使用-d参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略-X POST。
# -d参数可以读取本地文本文件的数据,向服务器发送。
curl -d '@data.txt' https://google.com/login
# 上面命令读取data.txt文件的内容,作为数据体向服务器发送。

# --data-urlencode参数等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。
curl --data-urlencode 'comment=hello world' https://google.com/login
# 上面代码中,发送的数据hello world之间有一个空格,需要进行 URL 编码。

# -e参数用来设置 HTTP 的标头Referer,表示请求的来源。
curl -e 'https://google.com?q=example' https://www.example.com
# 上面命令将Referer标头设为https://google.com?q=example。

# -H参数可以通过直接添加标头Referer,达到同样效果。
curl -H 'Referer: https://google.com?q=example' https://www.example.com

# -F参数用来向服务器上传二进制文件。
curl -F 'file=@photo.png' https://google.com/profile
# 上面命令会给 HTTP 请求加上标头Content-Type: multipart/form-data,然后将文件photo.png作为file字段上传。
# -F参数可以指定 MIME 类型。
curl -F 'file=@photo.png;type=image/png' https://google.com/profile
# 上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为application/octet-stream。
# -F参数也可以指定文件名。
curl -F 'file=@photo.png;filename=me.png' https://google.com/profile
# 上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。

# -G参数用来构造 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

# -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 数据。

# -i参数打印出服务器回应的 HTTP 标头。
curl -i https://www.example.com
# 上面命令收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码。

# -I参数向服务器发出 HEAD 请求,然会将服务器返回的 HTTP 标头打印出来。
curl -I https://www.example.com
# 上面命令输出服务器对 HEAD 请求的回应。

# --head参数等同于-I。
curl --head https://www.example.com

# -k参数指定跳过 SSL 检测。
curl -k https://www.example.com
# 上面命令不会检查服务器的 SSL 证书是否正确。

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

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

# -m switch指定执行命令所需的最长时间。
# 经过指定的时间后,cURL将退出正在执行的操作,即使它正在下载或上传文件。cURL会以秒为单位指定您想要的最长时间。因此,要在一分钟后超时,该命令将如下所示:
curl -m 60 example.com
# 您可以使用cURL指定的另一种超时类型是用于链接的时间量。这有助于确保cURL不会花费过多的时间来尝试连接处于脱机状态或无法访问的主机。

# 它也接受秒作为参数。该选项被写为–connect-timeout。
curl --connect-timeout 60 example.com

# -o, --output
# -o参数将服务器的回应保存成文件,等同于wget命令。
curl -o example.html https://www.example.com
# 上面命令将www.example.com保存成example.html。

# -O参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。
curl -O https://www.example.com/foo/bar.html
# 上面命令将服务器回应保存成文件,文件名为bar.html。

# -s参数将不输出错误和进度信息。
curl -s https://www.example.com
# 上面命令一旦发生错误,不会显示错误信息。不发生错误的话,会正常显示运行结果。
# 如果想让 curl 不产生任何输出,可以使用下面的命令。
curl -s -o /dev/null https://google.com
# -S参数指定只输出错误信息,通常与-o一起使用。
curl -s -o /dev/null https://google.com
# 上面命令没有任何输出,除非发生错误。

# -u参数用来设置服务器认证的用户名和密码。
curl -u 'bob:12345' https://google.com/login
# 上面命令设置用户名为bob,密码为12345,然后将其转为 HTTP 标头Authorization: Basic Ym9iOjEyMzQ1。
# curl 能够识别 URL 里面的用户名和密码。
curl https://bob:12345@google.com/login
# 上面命令能够识别 URL 里面的用户名和密码,将其转为上个例子里面的 HTTP 标头。
curl -u 'bob' https://google.com/login
# 上面命令只设置了用户名,执行后,curl 会提示用户输入密码。

# -v参数输出通信的整个过程,用于调试。
curl -v https://www.example.com

# --trace参数也可以用于调试,还会输出原始的二进制数据。
curl --trace - https://www.example.com

# -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 协议。

# -X参数指定 HTTP 请求的方法。
curl -X POST https://www.example.com
# 上面命令对https://www.example.com发出 POST 请求。

ex:

1
2
3
4
5
6
7
8
9
10
11
12
curl -k -x 'http://127.0.0.1:8888' 'https://www.jianshu.com/shakespeare/notes/31762521/user_notes' \
-H 'Connection: keep-alive' \
-H 'Accept: application/json' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36' \
-H 'Sec-Fetch-Site: same-origin' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Referer: https://www.jianshu.com/p/9f9c5cba36e8' \
-H 'Accept-Language: zh-CN,zh;q=0.9' \
-H 'Cookie: __yadk_uid=Ein4n8jn6l5P6GObqMAXjgWVHPQddHrg; _ga=GA1.2.1043383107.1597137593; _gid=GA1.2.1914484739.1597137593; web_login_version=MTU5NzQ4MzUwMw%3D%3D--5dbb5619f4070e31714c813c4eccafb00f0ed003; remember_user_token=W1sxNTAzNjgyMl0sIiQyYSQxMSQzbHZDZTBQLnFZVWpvak00SzFydlNPIiwiMTU5ODQ1MzAxMS44MjQ3NjQiXQ%3D%3D--0d91c3663c7ac2048e7f7cbc941b9f66ca3f3a88; _m7e_session_core=7b490b8cfcf97f08559f60d68f9a0258; read_mode=day; default_font=font2; locale=zh-CN; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22173dcd19edbafb-00bf4f7297fa3c-4353760-1327104-173dcd19edc8bc%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E8%87%AA%E7%84%B6%E6%90%9C%E7%B4%A2%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22httpbin%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fwww.baidu.com%2Fs%22%2C%22%24latest_utm_source%22%3A%22recommendation%22%2C%22%24latest_utm_medium%22%3A%22seo_notes%22%2C%22%24latest_utm_campaign%22%3A%22maleskine%22%2C%22%24latest_utm_content%22%3A%22note%22%7D%2C%22%24device_id%22%3A%22173dcd19edbafb-00bf4f7297fa3c-4353760-1327104-173dcd19edc8bc%22%7D; _gat=1; Hm_lvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1598408433,1598413603,1598453016,1598460218; Hm_lpvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1598460218' \
-H 'If-None-Match: W/"b97803d19320e20eed0659fcda4b0957"' \
--compressed

CURL状态码列表

状态码 状态原因 解释
0 正常访问
1 错误的协议 未支持的协议。此版cURL 不支持这一协议。
2 初始化代码失败 初始化失败。
3 URL格式不正确 URL 格式错误。语法不正确。
4 请求协议错误
5 无法解析代理 无法解析代理。无法解析给定代理主机。
6 无法解析主机地址 无法解析主机。无法解析给定的远程主机。
7 无法连接到主机 无法连接到主机。
8 远程服务器不可用 FTP 非正常的服务器应答。cURL 无法解析服务器发送的数据。
9 访问资源错误 FTP 访问被拒绝。服务器拒绝登入或无法获取您想要的特定资源或目录。最有可 能的是您试图进入一个在此服务器上不存在的目录。
11 FTP密码错误 FTP 非正常的PASS 回复。cURL 无法解析发送到PASS 请求的应答。
13 结果错误 FTP 非正常的的PASV 应答,cURL 无法解析发送到PASV 请求的应答。
14 FTP回应PASV命令 FTP 非正常的227格式。cURL 无法解析服务器发送的227行。
15 内部故障 FTP 无法连接到主机。无法解析在227行中获取的主机IP。
17 设置传输模式为二进制 FTP 无法设定为二进制传输。无法改变传输方式到二进制。
18 文件传输短或大于预期 部分文件。只有部分文件被传输。
19 RETR命令传输完成 FTP 不能下载/访问给定的文件, RETR (或类似)命令失败。
21 命令成功完成 FTP quote 错误。quote 命令从服务器返回错误。
22 返回正常 HTTP 找不到网页。找不到所请求的URL 或返回另一个HTTP 400或以上错误。 此返回代码只出现在使用了-f/–fail 选项以后。
23 数据写入失败 写入错误。cURL 无法向本地文件系统或类似目的写入数据。
25 无法启动上传 FTP 无法STOR 文件。服务器拒绝了用于FTP 上传的STOR 操作。
26 回调错误 读错误。各类读取问题。
27 内存分配请求失败 内存不足。内存分配请求失败。
28 访问超时 操作超时。到达指定的超时期限条件。
30 FTP端口错误 FTP PORT 失败。PORT 命令失败。并非所有的FTP 服务器支持PORT 命令,请 尝试使用被动(PASV)传输代替!
31 FTP错误 FTP 无法使用REST 命令。REST 命令失败。此命令用来恢复的FTP 传输。
33 不支持请求 HTTP range 错误。range “命令”不起作用。
34 内部发生错误 HTTP POST 错误。内部POST 请求产生错误。
35 SSL/TLS握手失败 SSL 连接错误。SSL 握手失败。
36 下载无法恢复 FTP 续传损坏。不能继续早些时候被中止的下载。
37 文件权限错误 文件无法读取。无法打开文件。权限问题?
38 LDAP可没有约束力 LDAP 无法绑定。LDAP 绑定(bind)操作失败。
39 LDAP搜索失败 LDAP 搜索失败。
41 函数没有找到 功能无法找到。无法找到必要的LDAP 功能。
42 中止的回调 由回调终止。应用程序告知cURL 终止运作。
43 内部错误 内部错误。由一个不正确参数调用了功能。
45 接口错误 接口错误。指定的外发接口无法使用。
47 过多的重定向 过多的重定向。cURL 达到了跟随重定向设定的最大限额跟
48 无法识别选项 指定了未知TELNET 选项。
49 TELNET格式错误 不合式的telnet 选项。
51 远程服务器的SSL证书 peer 的SSL 证书或SSH 的MD5指纹没有确定。
52 服务器无返回内容 服务器无任何应答,该情况在此处被认为是一个错误。
53 加密引擎未找到 找不到SSL 加密引擎。
54 设定默认SSL加密失败 无法将SSL 加密引擎设置为默认。
55 无法发送网络数据 发送网络数据失败。
56 衰竭接收网络数据 在接收网络数据时失败。
57
58 本地客户端证书 本地证书有问题。
59 无法使用密码 无法使用指定的SSL 密码。
60 凭证无法验证 peer 证书无法被已知的CA 证书验证。
61 无法识别的传输编码 无法辨识的传输编码。
62 无效的LDAP URL 无效的LDAP URL。
63 文件超过最大大小 超过最大文件尺寸。
64 FTP失败 要求的FTP 的SSL 水平失败。
65 倒带操作失败 发送此数据需要的回卷(rewind)失败。
66 SSL引擎失败 初始化SSL 引擎失败。
67 服务器拒绝登录 用户名、密码或类似的信息未被接受,cURL 登录失败。
68 未找到文件 在TFTP 服务器上找不到文件。
69 无权限 TFTP 服务器权限有问题。
70 超出服务器磁盘空间 TFTP 服务器磁盘空间不足。
71 非法TFTP操作 非法的TFTP 操作。
72 未知TFTP传输的ID 未知TFTP 传输编号(ID)。
73 文件已经存在 文件已存在(TFTP) 。
74 错误TFTP服务器 无此用户(TFTP) 。
75 字符转换失败 字符转换失败。
76 必须记录回调 需要字符转换功能。
77 CA证书权限 读SSL 证书出现问题(路径?访问权限? ) 。
78 URL中引用资源不存在 URL 中引用的资源不存在。
79 错误发生在SSH会话 SSH 会话期间发生一个未知错误。
80 无法关闭SSL连接 未能关闭SSL 连接。
81 服务未准备
82 无法载入CRL文件 无法加载CRL 文件,丢失或格式不正确(在7.19.0版中增加) 。
83 发行人检查失败 签发检查失败(在7.19.0版中增加) 。

HTTPie

https://github.com/httpie/httpie

1
pip install httpie

HTTPie基于python编写,内部使用了Requests和Pygments库

HTTPie比cURL直观,默认输入和输出都是json格式 (而cURL必须要指定-H "Content-Type: application/json")

1
2
http POST http://host:port/v3/auth/tokens @auth.json
http GET http://host:port/v2/xx/servers X-Auth-Token:xxx