Linux之curl

Share on facebook
Share on google
Share on twitter
Share on linkedin

 简介

curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。

它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。

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

$ curl https://www.example.com

上面命令向www.example.com发出 GET 请求,服务器返回的内容会在命令行输出。

-A

-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

-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

-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

–data-urlencode参数等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。

$ curl --data-urlencode 'comment=hello world' https://google.com/login

上面代码中,发送的数据hello world之间有一个空格,需要进行 URL 编码。

-e

-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

-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

-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

-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

-i参数打印出服务器回应的 HTTP 标头。

$ curl -i https://www.example.com

上面命令收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码。

-I

-I参数向服务器发出 HEAD 请求,然会将服务器返回的 HTTP 标头打印出来。

$ curl -I https://www.example.com

上面命令输出服务器对 HEAD 请求的回应。

–head参数等同于-I。

$ curl --head https://www.example.com

-k

-k参数指定跳过 SSL 检测。

$ curl -k https://www.example.com

上面命令不会检查服务器的 SSL 证书是否正确。

-L

-L参数会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。

$ curl -L -d 'tweet=hi' https://api.twitter.com/tweet

–limit-rate

–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

-O参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。

$ curl -O https://www.example.com/foo/bar.html

上面命令将服务器回应保存成文件,文件名为bar.html。

-s

-s参数将不输出错误和进度信息。

$ curl -s https://www.example.com

上面命令一旦发生错误,不会显示错误信息。不发生错误的话,会正常显示运行结果。

如果想让 curl 不产生任何输出,可以使用下面的命令。

$ curl -s -o /dev/null https://google.com

-S

-S参数指定只输出错误信息,通常与-o一起使用。

$ curl -S -o /dev/null https://google.com

上面命令没有任何输出,除非发生错误。

-u

-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

-v参数输出通信的整个过程,用于调试。

$ curl -v https://www.example.com

–trace参数也可以用于调试,还会输出原始的二进制数据。

$ curl --trace - https://www.example.com

-x

-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

-X参数指定 HTTP 请求的方法。

$ curl -X POST https://www.example.com

上面命令对https://www.example.com发出 POST 请求。


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