在 Linux 中,curl 是一个利用 URL 规则在命令行下工作的文件传输工具,可以说是一款非常强大的 HTTP 命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称 curl 为下载工具。本文先介绍 curl 的常见参数和一批经典用法示例,再逐个讲解最常用的参数。
语法与常见参数
语法:
curl [option] [url]
常见参数如下:
| 参数 | 说明 |
|---|---|
| -A/–user-agent \<string> | 设置用户代理发送给服务器 |
| -b/–cookie \<name=string/file> | cookie 字符串或文件读取位置 |
| -c/–cookie-jar \<file> | 操作结束后把 cookie 写入到这个文件中 |
| -C/–continue-at \<offset> | 断点续传 |
| -D/–dump-header \<file> | 把 header 信息写入到该文件中 |
| -e/–referer | 来源网址 |
| -f/–fail | 连接失败时不显示 HTTP 错误 |
| -o/–output | 把输出写到该文件中 |
| -O/–remote-name | 把输出写到该文件中,保留远程文件的文件名 |
| -r/–range \<range> | 检索来自 HTTP/1.1 或 FTP 服务器字节范围 |
| -s/–silent | 静音模式,不输出任何东西 |
| -T/–upload-file \<file> | 上传文件 |
| -u/–user \<user[:password]> | 设置服务器的用户和密码 |
| -w/–write-out [format] | 指定输出完成后打印的内容 |
| -x/–proxy \<host[:port]> | 在给定的端口上使用 HTTP 代理 |
| -#/–progress-bar | 进度条显示当前的传送状态 |
常用示例
1. 基本用法
curl http://www.linux.com
执行后,www.linux.com 的 html 就会显示在屏幕上了。
Ps:由于安装 Linux 的时候很多时候是没有安装桌面的,也就意味着没有浏览器,因此这个方法也经常用于测试一台服务器是否可以访问到一个网站。
2. 保存访问的网页
2.1 使用 Linux 的重定向功能保存:
curl http://www.linux.com >> linux.html
2.2 使用 curl 的内置选项 -o(小写)保存网页:
curl -o linux.html http://www.linux.com
执行完成后会显示如下进度信息,显示 100% 则表示保存成功:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 79684 0 79684 0 0 3437k 0 --:--:-- --:--:-- --:--:-- 7781k
2.3 使用 curl 的内置选项 -O(大写)保存网页中的文件。要注意这里后面的 URL 要具体到某个文件,不然抓不下来:
curl -O http://www.linux.com/hello.sh
3. 测试网页返回值
curl -o /dev/null -s -w %{http_code} www.linux.com
Ps:在脚本中,这是很常见的测试网站是否正常的用法。
4. 指定 proxy 服务器以及其端口
很多时候上网需要用到代理服务器(比如使用代理服务器上网,或者因为使用 curl 访问别人网站而被别人屏蔽了 IP 地址的时候),幸运的是 curl 通过内置选项 -x 支持设置代理:
curl -x 192.168.100.100:1080 http://www.linux.com
5. cookie
有些网站是使用 cookie 来记录 session 信息的。对于 Chrome 这样的浏览器,可以轻易处理 cookie 信息,而在 curl 中只要增加相关参数,也可以很容易地处理 cookie。
5.1 保存 http 的 response 里面的 cookie 信息,内置选项 -c(小写):
curl -c cookiec.txt http://www.linux.com
执行后 cookie 信息就被存到了 cookiec.txt 里面了。
5.2 保存 http 的 response 里面的 header 信息,内置选项 -D:
curl -D cookied.txt http://www.linux.com
执行后 header 信息就被存到了 cookied.txt 里面了。
注意:-c(小写)产生的 cookie 和 -D 里面的 cookie 是不一样的。
5.3 使用 cookie
很多网站都是通过监视你的 cookie 信息来判断你是否按规矩访问他们的网站的,因此我们需要使用保存的 cookie 信息,内置选项 -b:
curl -b cookiec.txt http://www.linux.com
6. 模仿浏览器
有些网站需要使用特定的浏览器去访问,有些还需要使用某些特定的版本。curl 内置选项 -A 可以让我们指定浏览器去访问网站:
curl -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://www.linux.com
这样服务器端就会认为是使用 IE 8.0 去访问的。
7. 伪造 referer(盗链)
很多服务器会检查 http 访问的 referer 从而控制访问。比如:你是先访问首页,然后再访问首页中的邮箱页面,这里访问邮箱的 referer 地址就是访问首页成功后的页面地址;如果服务器发现对邮箱页面访问的 referer 地址不是首页的地址,就断定那是个盗链了。
curl 中内置选项 -e 可以让我们设定 referer:
curl -e "www.linux.com" http://mail.linux.com
这样就会让服务器以为你是从 www.linux.com 点击某个链接过来的。
8. 下载文件
8.1 利用 curl 下载文件
使用内置选项 -o(小写):
curl -o dodo1.jpg http://www.linux.com/dodo1.JPG
使用内置选项 -O(大写):
curl -O http://www.linux.com/dodo1.JPG
这样就会以服务器上的名称保存文件到本地。
8.2 循环下载
有时候下载的图片可能是前面的部分名称一样,只有最后的扩展名不一样:
curl -O http://www.linux.com/dodo[1-5].JPG
这样就会把 dodo1、dodo2、dodo3、dodo4、dodo5 全部保存下来。
8.3 下载重命名
curl -O http://www.linux.com/{hello,bb}/dodo[1-5].JPG
由于下载的 hello 与 bb 目录中的文件名都是 dodo1、dodo2、dodo3、dodo4、dodo5,因此第二次下载的会把第一次下载的覆盖,这样就需要对文件进行重命名:
curl -o #1_#2.JPG http://www.linux.com/{hello,bb}/dodo[1-5].JPG
这样 hello/dodo1.JPG 下载下来就会变成 hello_dodo1.JPG,其他文件依此类推,从而有效地避免了文件被覆盖。
8.4 分块下载
有时候下载的东西会比较大,这个时候我们可以分段下载,使用内置选项 -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
这样就可以查看 dodo1.JPG 的内容了。
8.5 通过 ftp 下载文件
curl 可以通过 ftp 下载文件,它提供两种从 ftp 中下载的语法:
curl -O -u 用户名:密码 ftp://www.linux.com/dodo1.JPG
curl -O ftp://用户名:密码@www.linux.com/dodo1.JPG
8.6 显示下载进度条
curl -# -O http://www.linux.com/dodo1.JPG
8.7 不显示下载进度信息
curl -s -O http://www.linux.com/dodo1.JPG
9. 断点续传
在 Windows 中,我们可以使用迅雷这样的软件进行断点续传。curl 通过内置选项 -C 同样可以达到相同的效果。
如果在下载 dodo1.JPG 的过程中突然掉线了,可以使用以下的方式续传:
curl -C -O http://www.linux.com/dodo1.JPG
10. 上传文件
curl 不仅仅可以下载文件,还可以上传文件,通过内置选项 -T 来实现:
curl -T dodo1.JPG -u 用户名:密码 ftp://www.linux.com/img/
这样就向 ftp 服务器上传了文件 dodo1.JPG。
11. 显示抓取错误
curl -f http://www.linux.com/error
常用参数详解
下面再按参数逐个展开,结合示例说明它们的典型用法。
GET 请求
不带有任何参数时,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;foo2=bar2' 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。
-d
-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 字节。
-o
-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 参数指定只输出错误信息,通常与 -s 一起使用。
curl -s -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 请求。