curl是一个命令行工具,经常在shell脚本中使用它,但是现在我们想深入的介绍一下curl到底能做什么,以及怎么样使用curl功能。目前curl所支持常见的协议有FTP、HTTP、HTTPS、IMAP、LDAP、POP3、RTMP、RTSP、TELNET、TFTP、SCP等等。
curl–详细模式
如果执行curl命令没有执行或者返回我们想要期望看到的东西,例如执行以下命令:
curl https://www.baidu.com/ -o saved
上面的信息看,显示的信息量太少了,使用参数-v选项,以获得更多详细信息。
如果使用-v选项,界面上会显示更多信息,例如执行:
curl -v https://www.baidu.com/ -o saved
从截屏上面的信息来看,curl运行会用前缀*
来打印信息。下面我们来分析https请求打印了哪些信息。
* Trying 183.232.231.172...
这行信息告诉我们,curl正在尝试连接到这个IP地址,域名是“baidu.com”已被解析成为一个或者多个IP地址。
* Connected to www.baidu.com (183.232.231.172) port 443 (#0)
这行说明了连接到了目标网站(百度),连接到的端口是443(https默认端口),(#0)是curl为这个连接分配的内部数字。
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* subject: CN=baidu.com,O="Beijing Baidu Netcom Science Technology Co., Ltd",OU=service operation department,L=beijing,ST=beijing,C=CN
* start date: 4月 02 07:04:58 2020 GMT
* expire date: 7月 26 05:31:02 2021 GMT
* common name: baidu.com
* issuer: CN=GlobalSign Organization Validation CA - SHA256 - G2,O=GlobalSign nv-sa,C=BE
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0> GET / HTTP/1.1
从上面的信息上来看,使用HTTPS协议,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL,因此加密的详细内容就需要 SSL。上面的信息显示了服务器证书的一些细节,使用了哪些加密方式。
> User-Agent: curl/7.29.0
> Host: www.baidu.com
> Accept: */*
>
我们在看看上面的信息,这个对网站的请求,请求的版本是7.29.0版本的curl发起的,host是www.baidu.com。如果注意的话,我们会看到HTTPS请求的最后一行是以后空行。这里表示标头和正文的分隔。
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: keep-alive
< Content-Length: 2443
< Content-Type: text/html
< Date: Sun, 30 May 2021 12:20:21 GMT
< Etag: "58860411-98b"
< Last-Modified: Mon, 23 Jan 2017 13:24:33 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<
上面的信息使用的是HTTP响应消息的标头,看到200表示能正常访问。conten-Length长度2443字节的数据被保存到saved文件中。更多具体信息我们就不一一往下介绍了。
curl–跟踪详细信息
有时候-v选项已经不能够满足我们的需求,当使用HTTPS、FTPS、SFTP协议进行加密传输文件时,我们使用Wireshark或者tcpdump不能保存完整信息。
在这里我们就要介绍一下curl自带的两个选项 --trace和 --trace-ascii
curl --trace dump_file https://www.baidu.com/
上面执行完命令后,会生成一个叫作dump_file的文件,如下所示:
发送和接收的每个字节都以十六进制的数组显示出来。
如果你觉得十六进制对你没有什么帮助,可以使用二进制显示,如下命令
curl --trace-ascii dump_file https://www.baidu.com/
高精度的时间戳
有个选项–trace-time能把所有输出的信息都会加上高精度的时间戳。它可以与常规的-v和–trace、–trace-ascii选项一起使用。
curl -v --trace-time https://www.baidu.com/
这些都是本地时间,格式都是小时:分钟:秒以及微妙。
输出内容写入stdout
使用选项-w会在传输任务后完成打印一些信息。并且还提供了大量可添加输出内容。
如歌将一个字符串传给这个选项,那么这个字符串就会被打印出来。
curl -w “hello world\n” https://www.baidu.com/
压缩(–compressed)
HTTPS压缩可以通过使用–compressed选项进行压缩。
curl --compressed https://www.baidu.com/
使用这个选项后,如果服务器支持压缩,它会传输压缩过的数据,curl会在保存或发送到的stdout前对数据进行压缩。
shell重定向
在Linux系统中,你可以使用重定向 > filename将stdout重定向到文件中。
curl https://www.baidu.com/ > test.html
文件重定向会将curl的所有输出重定向到文件中。可以使用多个curl重定向到指定的文件中,这里就不举例了。
速率限定
在传输数据时,curl会尝试尽快完成任务。它可以用于上传和下载,它的速度取决于硬件设备、网络连接宽带、远程服务器的负载和延迟等等。
如果你可能希望curl可以减慢速度,以便其他网络用户有机会获取数据,可以使用选项–limit-rate让速率不超过指定的字节/秒。
下面我们想使用命令curl下载速率不超过500字节。这里要说一下,K表示千字节、M表示兆字节、G表示千兆字节。
curl https://www.bilibili.com/ --limit-rate 500K
这里要注意一下,你可能会知道最大速率,但是curl永远不会知道最大速度是多少,它会在运行范围内尽快完成传输。
连接超时
如果网络状况不稳定或远程服务器出现故障,TCP连接可能会失败或者速度慢。
要想减少对脚本或者其他应用影响,你可以为curl设置允许尝试连接的最长时间,使用选项 --connect-timeout 设置curl允许尝试连接的最长时间。
curl --connect-timeout 2 https://www.bilibili.com/
可以运行curl在2毫秒内建立连接。
总结
curl关心所有网络协议传输相关的东西,为指定的URL资源执行网络传输,在Linux中,curl可以被完美地应用在脚本或者自动化程序中。
欢迎关注微信公众号【程序猿编码】,欢迎添加本人微信号(17865354792),交个朋友,咱们一起学习进步!