Linux下深入理解curl可以做什么?

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: 402 07:04:58 2020 GMT
* 	expire date: 726 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),交个朋友,咱们一起学习进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值