目录
在 Linux 中 curl 是一个利用 URL 规则在命令行下工作的文件传输工具,可以说是一款很强大的 http 命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称 url 为下载工具。
作为一款强力工具,curl 支持包括 HTTP、HTTPS、FTP 等众多协议,还支持 GET、POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征,还可以做网页处理流程和数据检索自动化。
在进行 web 后台程序开发测试过程中,常常会需要发送 url 进行测试,使用 curl 可以方便地模拟出符合需求的 url 命令。
概述
curl(cURL)是一个用于传输数据的命令行工具,其诞生于20多年前,最早版本是在1998年。
curl支持以多种方式检索和发送数据,并输出到标准输出,可以无缝衔接标准unix管道使用。在绝大多数的*nix操作系统上都默认安装。curl支持各种协议,包括 HTTP/HTTPS、FTP和SCP。
Linux Curl命令详解
url [option] [url]
参数 | 描述 |
---|---|
option | curl 命令使用的选项。 |
url | 请求的 URL。 |
使用 curl 命令,加上参数 option 给指定的 url 发送请求。
Curl命令参数
参数 | 描述 |
---|---|
-A/–user-agent | 设置用户代理发送给服务器。 |
-b/–cookie <name=string/file> | cookie 字符串或文件读取位置。 |
-c/–cookie-jar | 操作结束后把 cookie 写入到这个文件中 |
-C/–continue-at | 断点续转 |
-D/–dump-header | 把 header 信息写入到该文件中 |
-e/–referer | 来源网址 |
-f/–fail | 连接失败时不显示 http 错误 |
-o/–output | 把输出写到该文件中 |
-O/–remote-name | 把输出写到该文件中,保留远程文件的文件名 |
-r/–range | 检索来自 HTTP/1.1 或 FTP 服务器字节范围 |
-s/–silent | 静音模式。不输出任何东西 |
-T/–upload-file | 上传文件 |
-u/–user <user[:password]> | 设置服务器的用户和密码 |
-w/–write-out [format] | 什么输出完成后 |
-x/–proxy <host[:port]> | 在给定的端口上使用HTTP代理 |
-#/–progress-bar | 进度条显示当前的传送状态 |
Curl模仿浏览器命令
我们在使用 Linux 的 curl 命令,访问网站时,可以通过 A 参数来指定我们访问该网站使用的指定的浏览器或者指定的浏览器的指定版本。
Curl模仿浏览器详解
url -A info url
参数 | 描述 |
---|---|
info | 模仿的浏览器信息。 |
url | 请求的 URL。 |
我们使用 A 参数设置浏览器信息,来模拟浏览器访问网站。
模仿浏览器
使用 curl 命令,可以指定浏览器信息,来访问网站,具体命令如下:
url -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://www.haicoder.net
我们使用了 A 参数模仿了使用 IE8.0 去访问了网站。
Curl伪造refer命令
我们在使用 Linux 的 curl 命令时,可以使用 e 参数,来伪造 refer 信息,以防止某些网站的防盗链功能屏蔽我们的访问。
很多服务器会检查 http 访问的 referer 从而来控制访问。比如:你是先访问首页,然后再访问首页中的邮箱页面,这里访问邮箱的 referer 地址就是访问首页成功后的页面地址,如果服务器发现对邮箱页面访问的 referer 地址不是首页的地址,就断定那是个盗链了。
Curl伪造refer详解
url -e referUrl url
参数 | 描述 |
---|---|
referUrl | 模仿的 url 信息。 |
url | 请求的 URL。 |
我们使用 e 参数模仿请求的 url。
伪造refer
使用 curl 命令,可以伪造访问的 url 信息,来访问网站,具体命令如下:
url -e "www.haicoder.net" http://www.haicoder.net/uploads/pic/server/golang/golang-basic-syntax/01%20go%20helloworld.png
运行后,终端输出如下:
Curl下载文件或网页详解
语法
curl -o fileName url
参数
参数 | 描述 |
---|---|
fileName | 保存的文件名。 |
url | 请求的 URL。 |
说明
我们使用 o 参数将 url 的信息保存到本地 fileName 文件中。
语法
curl -O url
参数 | 描述 |
---|---|
url | 请求的 URL。 |
我们使用 O 参数将 url 的信息保存到本地文件中,文件名与服务器上的文件同名。
Curl下载进度条命令
我们使用 Linux 的 curl 命令,在下载文件时,还可以显示下载的进度条信息。
Curl下载进度条详解
语法
curl -# -O url
参数
参数 | 描述 |
---|---|
url | 要下载的 url。 |
Curl断点续传命令
我们在使用 Linux 的 curl 命令,在下载文件时,还可以支持断点续传功能,即,我们下载文件过程中断线了,可以继续下载。
Curl断点续传详解
语法
url -C offset -O url
参数
参数 | 描述 |
---|---|
offset | 开始下载位置。 |
url | 要下载的 url。 |
断点续传
使用 curl 命令,下载文件时,还可以支持断点续传,具体命令如下:
url -C 0 -O http://www.haicoder.net/uploads/pic/server/golang/golang-basic-syntax/01%20go%20helloworld.png
Curl上传文件命令
我们使用 Linux 的 curl 命令,不仅仅可以支持下载文件,还可以支持上传文件,我们通过参数 T 实现上传文件功能。
Curl上传文件详解
语法
url -T uploadFile -u username:password uploadUrl
参数
参数 | 描述 |
---|---|
uploadFile | 需要上传的文件。 |
username | 用户名。 |
password | 密码。 |
uploadUrl | 上传的 Url。 |
Curl上传文件命令总结
我们使用 Linux 的 curl 命令,不仅仅可以支持下载文件,还可以支持上传文件,我们通过参数 T 实现上传文件功能。
Curl获取错误命令
我们在使用 Linux 的 curl 命令时,可以使用 f 参数,显示获取的错误信息。
Curl获取错误详解
语法
url -f url
参数
参数 | 描述 |
---|---|
url | 请求的 url。 |
获取错误
使用 curl 命令,可以获取错误信息,具体命令如下:
url -f www.haicoder.net
Curl GET请求命令
我们在使用 Linux 的 curl 命令时,可以实现 GET请求的功能,即可以模拟 HTTP 的 GET 请求。
Curl GET请求详解
语法
url "url?param1=val1¶m2=val2"
参数
参数 | 描述 |
---|---|
url | 请求的 URL。 |
param1 | 请求参数 1。 |
val1 | 请求参数 1 的值。 |
param2 | 请求参数 2。 |
val2 | 请求参数 2 的值。 |
说明
在发送 GET 请求时,请求参数放在 url 后面,因为有特殊字符 &,所以我们需要使用双引号进行包裹,或者,我们直接使用转义字符也可以,即 curl "url?param1=val1\¶m2=val2"
Curl GET请求命令总结
我们在使用 Linux 的 curl 命令时,可以实现 GET请求的功能,即可以模拟 HTTP 的 GET 请求。
Curl POST请求命令
我们在使用 Linux 的 curl 命令时,可以实现 POST 请求的功能,即可以模拟 HTTP 的 POST 请求。
Curl POST请求详解
语法
curl [-H] [HEAD] -X POST -d '{"key1": "val1", "key2":val2}' url
参数
参数 | 描述 |
---|---|
HEAD | 请求头信息。 |
key1 | 请求参数 1。 |
val1 | 请求参数 1 的值。 |
key2 | 请求参数 2。 |
val2 | 请求参数 2 的值。 |
url | 请求的 URL。 |
说明
在发送 POST 请求时,我们可以使用 H 参数,指定发送的请求头信息,使用 X 参数,说明我们发送的是 POST 请求。
使用 d 参数,设置我们请求的参数信息。
Curl POST请求详解
语法
url -H "Content-Type: application/json" -X POST -d '{"key1": "val1", "key2":val2}' url
说明
我们使用了 H 参数,设置了请求的参数是 Json 类型。
Curl POST请求命令总结
我们在使用 Linux 的 curl 命令时,可以实现 POST 请求的功能,即可以模拟 HTTP 的 POST 请求。
Curl设置代理proxy命令
我们在使用 Linux 的 curl 命令,访问网站时,还可以使用 x 参数,来指定访问网站时使用的具体代理地址和端口。
Curl设置代理proxy详解
语法
url -x proxyAddr:proxyPort url
参数
参数 | 描述 |
---|---|
proxyAddr | 代理 ip。 |
proxyPort | 代理端口。 |
url | 请求的 URL。 |
说明
我们使用 x 参数设置代理信息。
设置代理proxy信息
使用 curl 命令,访问网站时,可以设置代理信息,具体命令如下:
url -x 220.181.38.150 www.haicoder.net
Curl设置代理详解
Web代理服务器
Web代理服务器充当客户端和目标服务器之间的中介。客户端首先访问代理,然后代理执行它并将结果返回给客户端。
有些Web站点是有限制的,我们无法直接通过当前IP直接访问目标站点;还有一些站点对访问请求是有一定限制,而我们在请求数据时候为了请求速度也需要突破IP限制。通过使用代理服务,我们就可以突破上述限制。
curl代理设置
为演示需要,本文中示例中使用的代理将设置为本地机器上,使用端口5000。默认情况下,代理语句中唯一需要的部分是主机,默认端口80。我们将通过HTTP将数据传输到它,我们将明确指定完整性。为了方便,我们请求服务为httpbin。 Httpbin是一个开源的标准http服务显示,在请求/ip接口时候可以查看请求IP地址。
方法一:命令行参数
使用代理的第一个也是最简单的选项是使用命令行参数。Curl代理参数为-x(或者--proxy)。基本格式为:
-x, --proxy [protocol://]host[:port]
因此,要使用代理访问,可以使用:
curl -x 220.181.38.150 www.haicoder.net
其中,代理服务器的协议头,默认为http可以省略掉:
curl -x 127.0.0.1:5000 httpbin/ip
身份验证
此外,如果HTTP代理服务器也需要身份验证,可以使用 -U标志来指定它。
curl -U user:password --proxy 127.0.0.1:5000 httpbin/ip
某些代理服务器可能需要不同的身份验证方案。可以通过--proxy-anyauth指定curl以确定身份验证方案
curl -U user:password --proxy 127.0.0.1:5000 httpbin/ip --proxy-anyauth
如果认证密码中包含特殊字符,需要对其添加加上双引号("")。
curl -U "user:p@assword" --proxy 127.0.0.1:5000 httpbin/ip
上面命令中直接用密码容易被泄露并且会被记录在history日志中,在命令行中通过只提供用户名,然后可以交互式的,根据curl提示输入密码。
curl -U user --proxy 127.0.0.1:5000 httpbin/ip
> Enter proxy password for user 'user':
方法二:使用环境变量
可以使用环境变量配置实现curl使用代理服务器。curl允许通过设置变量为它支持的每个协议使用环境变量[scheme]_proxy。如果设置了这些,那么当使用对应协议时,curl将默认引入。对http和https协议:
export http_proxy="127.0.0.1:5000"
export https_proxy="127.0.0.1:5000"
同样可以添加认证参数:
export http_proxy="http://username:password@127.0.0.1:5000"
export https_proxy="http://username:password@127.0.0.1:5000"
然后所有,curl http和https请求就会自动使用代理。
与以这种方式设置的所有环境变量一样,这些只是临时变量,shell会话结束或重新启动系统时删除。但是,为了使其在所有会话中可用,可以将其附加到profile文件中,或者对于个人可以在.bashrc 或 .zshrc文件添加,实现持久化的代理设置。
方法三:使用别名
配置代理的另一种更持久的方法是shell别名,如果总是需要以这种方式定期连接,这很有用。通过别名可以cur将调用替换为使用代理的版本,这其实和上面的方法二同理。
alias curl="curl -x 127.0.0.1:5000"
方法四:使用.curlrc 配置
其实curl也支持个性化的配置参数配置,配置文件默认情况下在个人目录 ~/.curlrc(Windows上为 _curlrc),也可以指定其他文件路径。
在.curlrc配置文件中添加代理支持的方法为:
proxy = "http://127.0.0.1:5000"
实例:使用curl 提取网页的标题
最后举个更复杂的,我们使用unix管道将结合grep正则提取站点标题。
curl curl –silent baidu |grep -Eo '<title>(.*)</title>'
--silent参数可以去掉curl输出进度信息,对响应的内容用grep正则表达式中捕获标题。
结论
在本文中,我们介绍curl中使用代理服务器的各种方法,大家可以根据实际需要选择最合适方法。