命令行http调试利器curl如何使用?

curl,全称CommandLine URL 或 CommandLine Uniform Resource Locator,顾名思义,curl命令是在命令行方式下工作,利用URL的语法进行数据的传输或者文件的传输 。
crul的官方网站是 HTTPS://curl.haxx.se/,我们可以通过该网站获取此工具的最新版本,还有最全面的使用方法 。
从官网可以知道,curl支持30多种类型的传输方式,例如:FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Te.NET and TFTP等,这当中包含多种协议 。最常使用的有FILE、FTP、HTTP、HTTPS等协议 。
对于运维人员来说,在我们探测远程服务的时候,比如http传输,SOCKET连接时,这个工具能非常方便的作为验证工具和测试工具 。
下面看几个curl典型应用实例 。
1、 仅仅显示header信息
这个用法运维人员经常使用,可以探测一个网站的header信息,例如:
[root@localhost ~]# curl -I https://www.ixdba.net HTTP/1.1 200 OK Server: Nginx/1.13.9 Date: Mon, 04 Mar 2019 08:11:31 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive
通过curl的“-I”(大写的i)参数可以获取指定网站的header头信息,可以发现上面这个网站可以正常访问(200状态码),同时此网站的web服务器是nginx/1.13.9,并且还开启了keep-alive 。这些信息都是web运维必须要具备的 。
2、显示http状态代码
http状态码对web运维来讲,非常重要,在对web页面进行监控的时候,会经常通过状态码来判断网页的状态,如果返回状态码为非200状态,那么则认为网页异常 。要获取网页状态码,除了上面的“-I”参数外,还有更专业的方法,那就是使用 “-s”和“-o”参数组合,最后使用“-w”参数,可以这样使用:
[root@localhost ~]#curl -s -o /dev/null -w %{http_code}"n" http://www.baidu.com 200
其中:
 

? “-s”: 表示安静模式,不输出错误,或者进度条之类的 。? “-o”: 表示指定输出结果到某个文件,不指定的话默认是终端 。这里是将结果写入空设备中 。? “-w”表示输出一些定义的元数据,这里输出的是%{http_code},即http状态码 。除去http_code,还有http_connect、time_total、time_connect、time_Appconnect、time_redirect、size_download 、size_upload 、content_type、ssl_verify_result等变量可供选择 。输出变量需要按照%{variable_name}的格式 。? “n”表示换行
 
再来看个例子,通过http协议访问一个网站,命令如下:
[root@localhost ~]#curl -s -o /dev/null -w %{http_code}" "%{time_total}" "%{redirect_url}"n" http://www.ixdba.net 301 0.141 https://www.ixdba.net/
可以看到输出结果有个301,这表示当通过http访问此网站的时候,自动跳转到了https,执行了301定向操作,所以状态码变成了301,第二个输出“0.141”是变量“%{time_total}”解析出的结果,代表总时间,按秒计 。精确到小数点后三位,最后的“https://www.ixdba.net/” 是"%{redirect_url}"变量的输出结果,代表跳转后的url 。
3、使用curl实现url地址重定向(自动跳转)
默认情况下CURL不会发送HTTP Location headers(重定向),但使用了“-L”选项后,当一个被请求页面移动到另一个站点时,就会发送一个HTTP Loaction header作为请求,然后将请求重定向到新的地址上 。例如:访问http://www.ixdba.net 时,会自动将地址重定向到 https://www.ixdba.net 上 。
[root@localhost ~]# curl -L -I http://www.ixdba.net HTTP/1.1 301 Moved Permanently Server: nginx/1.13.9 Date: Fri, 01 Mar 2019 07:25:57 GMT Content-Type: text/html Content-Length: 185 Connection: keep-alive Location: https://www.ixdba.net/ Strict-Transport-Security: max-age=31536000; includeSubDomains; preload HTTP/1.1 200 OK Server: nginx/1.13.9 Date: Fri, 01 Mar 2019 07:25:58 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive
输出有两个部分,可以看到有自动的跳转,这是因为使用了-L参数,curl就会跳转到新的网址 。
4、抓取网页内容,并保存到本地
curl也能下载文件,达到跟wget相同的功能,例如将一个url文件保存到本地,保存原始文件名,可以通过“-O”参数实现:
[root@localhost ~]# curl -O https://www.ixdba.net/archives/2017/06/653.htm
但是有时候url中的文件名不固定或者想下载后重命名,可以通过“-o”实现,例如将url中的文件下载到本地,并命名为test.html,命令如下:
[root@localhost ~]#curl -o test.html https://www.ixdba.net/archives/2017/06/653.htm


推荐阅读