堪称神器的命令行工具系列之 curl
curl 非常有用的命令行工具库,用于通过 URL 传输数据。它的名字就是客户端(client)的 URL 工具的意思(command line tool and library for transferring data with URLs)。它的功能非常强大,命令行参数多达几十种。如能熟练使用,可以在很多应用场景下,发挥巨大的价值。本篇文章,就跟大家一起探讨下 curl 以及关于它的那些妙用。
关于 curl
curl 是免费的开源软件,截止 2021 年 2 月,最近稳定版本是 7.75.0;它支持包括 FTP、HTTP、HTTPS、FTP、SCP,SFTP 数十种协议;curl 在命令行或脚本中用于传输数据。另外,它还用于汽车,电视机,路由器,打印机,音频设备,移动电话,平板电脑,机顶盒,媒体播放器中,并且是数千种每天影响数十亿人口的软件应用程序的互联网传输基础。如果您想了解更多关于 curl,可参见 curl.se 或 github.com/curl/curl。
如何使用
curl https://nicelinks.site/
如上命令,不带有任何参数时,curl 就是发出 GET 请求(向 nicelinks.site,服务器返回的内容会在命令行输出。当然,你还可以为其添加各种参数(如 -A
、-b
、-c
、-d
、-e
、-F
、-H
等等),使得可以完成更多复杂任务;
-e
-e
参数用来设置 HTTP 的标头Referer
,表示请求的来源。
curl -e 'https://nicelinks.site?q=quickapp' https://quickapp.lovejade.cn/
上面命令将Referer
标头设为https://nicelinks.site?q=quickapp
。
--limit-rate
--limit-rate
用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境。下面命令将带宽限制在每秒 200K 字节。
curl --limit-rate 200k https://nicelinks.site
-F
-F
参数用来向服务器上传二进制文件。如下命令会给 HTTP 请求加上标头Content-Type: multipart/form-data
,然后将文件example.png
作为file
字段上传。
curl -F 'file=@example.png' https://example.com/files
-F
参数可以指定 MIME 类型。如下命令指定 MIME 类型为image/png
,否则 curl 会把 MIME 类型设为application/octet-stream
。
curl -F 'file=@example.png;type=image/png' https://example.com/files
-F
参数也可以指定文件名。在下面的命令中,原始文件名为 example.png
,但是服务器接收到的文件名为profile.png
。
curl -F 'file=@example.png;filename=me.png' https://example.com/files
上面,简单列举了些参数,以及具体作用;如果您想了解更多,可以参见:《cookbooks/curl》 或其中文翻译版文章 curl 的用法指南;对于 curl 参数及功能说明,可参见 curl - How To Use,或 curl 命令(中文说明)。
curl 妙用
查看网页源码
直接在 curl 命令后加上网址,就可以看到网页源码。以及个人所维护的倾城之链来举例:
curl https://nicelinks.site/
这里需要说明下的是,倾城之链前端基于 Vue 框架所构建的单页应用(SPA);且未采取 SSR
方式来解决 SEO 及首页渲染;因此您使用如上命令来请求,无论是针对哪些页面,得到的都是一段项目首页 html。为优化在非谷歌引擎 SEO 问题,基于 prerender,根据请求 url 是否携带_escaped_fragment_
参数,走预渲染路线服务;
curl https://nicelinks.site/\?_escaped_fragment_
基于如上命令,所获得的内容,才是真正渲染后的网页源代码;关于在 Nginx 的配置,清参见如下代码(3000 端口,为 prerender 服务);
if ($http_user_agent ~* "baiduspider|twitterbot|facebookexternalhit|rogerbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") {
set $prerender 1;
}
if ($args ~ "_escaped_fragment_") {
set $prerender 1;
}
if ($prerender = 1) {
set $prerender "127.0.0.1:3000";
rewrite .* /$scheme://$host$request_uri? break;
proxy_pass http://$prerender;
}
如果您想保存文件到本地,只需添加 -o
参数即可,如下命令:
curl -o your-file-name.html https://nicelinks.site/\?_escaped_fragment_
自动跳转
很多网址是自动跳转(或重定向)。使用-L
参数,curl 就会跳转到新的网址。
curl -L https://hacpai.com/
如上命令,就会跳转到 ld246.com 新地址。需要补充说明的是,如果页面在前端,通过修改 location.href
来跳转,curl -L
这种方式,是无法“跟着“自动跳转的。
显示通信过程
通过 -v
参数,可以显示一次 http 通信的整个过程,包括端口连接和 http request 头信息,参见如下命令:
curl -v https://github.com
如果你想要更详细的信息,可以通过下面的命令,查看更详细的通信过程:
curl --trace output.txt https://github.com
# or
curl --trace-ascii output.txt https://github.com
更进一步,如果想知道,一次传输中所消耗时间(毫秒数),添加 --trace-time
参数即可:
curl --trace-ascii output.txt --trace-time https://github.com
个人比较偏爱命令行工具,有时候也常用 curl 命令,来检查某网站是否能正常工作。
发送表单信息
发送表单信息,通常用 GET 和 POST 两种方法。GET方 法相对简单,只要把数据附在网址后面就行。
curl example.com/api/v1/profile?name=prfect-man
POST 方法必须把数据和网址分开,curl 就要用到 --data
参数,参加如下示例:
curl -X POST --data "file=xyz" example.com/api/v1/upload
如果你的数据没有经过表单编码,还可以让 curl 为你编码,参数是--data-urlencode
:
curl -X POST--data-urlencode "date=April 2" example.com/api/v1/timedate
文件上传
在倾城之链,先前收录了一个短链接文 + 件托管服务:THE NULL POINTER,其使用示例如下(当然,上传文件,在某些场景下,也可以 --form
来完成):
# 托管本地文件
curl -F'file=@yourfile.png' https://0x0.st
# 托管线上文件
curl -F'url=http://example.cn/img.jpg' https://0x0.st
调用服务
缩短您指定的 url
curl -F'shorten=https://nicelinks.site' https://0x0.st
获取所在地 ip
curl -L tool.lu/ip
# or
curl -L ip.tool.lu
当前IP: 119.120.121.122
归属地: 中国 xx省 oo市
获取天气预报
网站 wttr.in 支持命令行
请求天气预报,具体使用示例如下:
curl wttr.in
这样的服务,可谓比比皆是;当然,您也可以提供类似的服务,开放给同事、或者其他朋友,对效率很有帮助。而且,也无需提供前端界面,也能节省蛮多精力。倘若您需要些参考,# How to Easily use cURL for HTTP Requests 是一篇值得推荐的短篇文章。
下载文件并显示下载进度
curl -# -o pretty-gril.jpg https://w.wallhaven.cc/full/9m/wallhaven-9mxjp8.jpg
谈到下载这块儿,利用正则循环下载(文件名一样,部分尾号不同)、下载后重命名、分块儿下载、通过 ftp 下载等等,在此就不一一展开说明了。
当然,如果您从事编程开发,可以用到 curl 更多功能,比如,基于 curl 命令从文件中读取 cookie 信息、构造一个请求头、模拟 User Agent 字段、伪造 referer 等等,鉴于篇幅,就不在此展示说明;如果您有兴趣了解更多,可以参见 The Art Of Scripting HTTP Requests Using Curl;如果您有 curl 更多妙用方法,欢迎留言分享。